今天有小夥伴問怎麼去判讀string裏面的內容是不是double類型的,比如string a= "3.14"這個的內容就是double類型的,當然string的內容也應該可以是科學計數法表示double類型的數,比如string a = “1.3e2”這個也應該判定爲內容爲double類型。
下面通過兩種方法來進行判斷:
第一種
先上代碼,再解釋原理。
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
bool isdouble(const string str)
{
char* p = nullptr;
double d = strtod(str.c_str(), &p);
return d != HUGE_VAL && *p == '\0';
}
int main(void)
{
cout << boolalpha;
cout << isdouble("1.79769e400") << endl;
cout << isdouble("3.14") << endl;
cout << isdouble("1e3") << endl;
cout << isdouble("acv") << endl;
cout << isdouble("-3.14") << endl;
return 0;
}
這裏書寫了一個函數來判斷string的內容是否爲double類型。
- 在isdouble這個函數裏,首先定義了一個p指針,並將其指向nullptr,避免野指針。
- strtod是將一個字符串轉成double類型的數,注意第一個參數是c風格的字符串,所有使用c_str()將string對象轉成c風格字符串。c風格字符串也就是以’\0’結尾的字符串。而第二個參數爲char* 的對象的引用,其值由函數設置爲 str 中數值後的下一個字符.比如“3.14”這個字符串最後一個數字是4所以*p就是4後面的那個’\0’了。
- HUGE_VAL這個是爲了避免溢出而設置的,在C++裏面每一種數字類型都有其最大值和最小值,如果超過這個值就會發生溢出。這也是我第一個測試案例用的1.79769e400來測試溢出的問題。
- isdouble返回值:如果轉成double類型沒有溢出,並且*p的值是’\0’的話也就是說string裏面的值全部被轉換了,從而就說明string的值的double類型的。
- cout << boolalpha;這句話是爲了讓cout輸出true或者false而不是輸出0或者1。
測試的結果如下:
- 其中第一個是因爲溢出double類型的最大表示範圍了所有爲false。
第二種
這一種方法是利用異常捕獲來進行判斷的。
代碼如下:
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
bool isdouble(const string str)
{
double y;
try {
y = stod(str);
}
catch(const exception&){
return false;
}
return true;
}
int main(void)
{
cout << boolalpha;
cout << isdouble("1.79769e400") << endl;
cout << isdouble("3.14") << endl;
cout << isdouble("1e3") << endl;
cout << isdouble("acv") << endl;
cout << isdouble("-3.14") << endl;
return 0;
}
- stod是將string類型的數轉換爲double的函數,如果轉換失敗就會發生異常,所以可以使用這種方法來進行判斷string的內容是否爲double類型的數,如果發生異常就返回false反之返回true。
結果和上面的方法是一樣的。
當然也可以查看發生了何種異常導致轉換錯誤:
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
bool isdouble(const string str)
{
double y;
try {
y = stod(str);
}
catch(const exception& e){
cout << e.what()<< endl;
return false;
}
return true;
}
int main(void)
{
cout << boolalpha;
cout << isdouble("1.79769e400") << endl;
cout << isdouble("3.14") << endl;
cout << isdouble("1e3") << endl;
cout << isdouble("acv") << endl;
cout << isdouble("-3.14") << endl;
return 0;
}
- 通過在catch裏面輸出e.what()來查看發生了何種異常。
結果如下: