用戶可以在文本框中輸入double
。數字可能包含數千個分隔符。在將輸入的數字插入數據庫之前,我想驗證用戶輸入。將數千(和十進制)分隔符轉換爲雙精度字符串
是否有C++函數可以將這種輸入(1,555.99
)轉換爲double
?如果有的話,如果輸入無效(我不想結束與atof
類似的功能),它會發出錯誤信號嗎?
類似於strtod
,但必須接受帶有數千個分隔符的輸入。
用戶可以在文本框中輸入double
。數字可能包含數千個分隔符。在將輸入的數字插入數據庫之前,我想驗證用戶輸入。將數千(和十進制)分隔符轉換爲雙精度字符串
是否有C++函數可以將這種輸入(1,555.99
)轉換爲double
?如果有的話,如果輸入無效(我不想結束與atof
類似的功能),它會發出錯誤信號嗎?
類似於strtod
,但必須接受帶有數千個分隔符的輸入。
使用已接受千位分隔符的語言環境進行灌注的流,將輸入轉換爲double。
#include <locale>
#include <iostream>
int main() {
double d;
std::cin.imbue(std::locale(""));
std::cin >> d;
std::cout << d;
}
在這裏,我使用的未命名的區域,它檢索從環境區域設置信息(例如,從OS),並設置適當的語言環境(例如,在我的情況下,它設定成類似en_US
,它支持逗號作爲千位分隔符,所以:
Input: 1,234.5
Output: 1234.5
當然,我也可以灌輸std::cout
與(例如)使用不同的千位分隔符的一些區域,並得到輸出定製爲區域(但在這種情況下,我使用默認的「C」語言環境,它不使用數千個分隔符,只是爲了使v的數字性質alue明顯)。
當你需要的東西,這已經是「」你的程序作爲一個字符串來做到這一點,你可以用一個std::stringstream
做轉換:
std::string input = "1,234,567.89";
std::istringstream buffer(input);
buffer.imbue(std::locale(""));
double d;
buffer >> d;
我已經成功設置了區域設置,並且文本框被分類爲僅允許輸入有效的千位/小數點分隔符。 。我接受來自文本框的輸入,*不是來自'cin' *,這是我對你的答案感到困惑的原因 - >我將如何將你的解決方案應用於字符串*從文本框填充輸入?*像'std ::字符串s = 1,555.22'' //代碼轉換。 – AlwaysLearningNewStuff 2015-02-12 15:04:44
@AlwaysLearningNewStuff:使用'std :: stringstream'查看編輯答案。 – 2015-02-12 15:28:55
AC的解決辦法是的setlocale & sscanf的使用方法:
const char *oldL = setlocale(LC_NUMERIC, "de_DE.UTF-8");
double d1 = 1000.43, d2 = 0;
sscanf("1.000,43", "%'lf", &d2);
if (std::abs(d1-d2) < 0.01)
printf("OK \n");
else
printf("something is wrong! \n");
setlocale(LC_NUMERIC, oldL);
請注意,使用逗號作爲千位分隔符是特定於語言環境的。其他語言環境可能會使用不同的(甚至看似倒退的)慣例:[十進制和千位分隔符](http://docs.oracle.com/cd/E19455-01/806-0169/overview-9/index.html) – 2015-02-12 06:28:44
@JonathonReinhart大多數其他歐洲語言使用'.'或空格作爲千位分隔符和','作爲小數點分隔符 – 2015-02-12 06:30:52