C++判斷string裏面的內容是不是double類型

今天有小夥伴問怎麼去判讀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()來查看發生了何種異常。
    結果如下:
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章