2015-02-12 57 views
4

用戶可以在文本框中輸入double。數字可能包含數千個分隔符。在將輸入的數字插入數據庫之前,我想驗證用戶輸入。將數千(和十進制)分隔符轉換爲雙精度字符串

是否有C++函數可以將這種輸入(1,555.99)轉換爲double?如果有的話,如果輸入無效(我不想結束與atof類似的功能),它會發出錯誤信號嗎?

類似於strtod,但必須接受帶有數千個分隔符的輸入。

+0

請注意,使用逗號作爲千位分隔符是特定於語言環境的。其他語言環境可能會使用不同的(甚至看似倒退的)慣例:[十進制和千位分隔符](http://docs.oracle.com/cd/E19455-01/806-0169/overview-9/index.html) – 2015-02-12 06:28:44

+1

@JonathonReinhart大多數其他歐洲語言使用'.'或空格作爲千​​位分隔符和','作爲小數點分隔符 – 2015-02-12 06:30:52

回答

9

使用已接受千位分隔符的語言環境進行灌注的流,將輸入轉換爲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; 
+0

我已經成功設置了區域設置,並且文本框被分類爲僅允許輸入有效的千位/小數點分隔符。 。我接受來自文本框的輸入,*不是來自'cin' *,這是我對你的答案感到困惑的原因 - >我將如何將你的解決方案應用於字符串*從文本框填充輸入?*像'std ::字符串s = 1,555.22'' //代碼轉換。 – AlwaysLearningNewStuff 2015-02-12 15:04:44

+1

@AlwaysLearningNewStuff:使用'std :: stringstream'查看編輯答案。 – 2015-02-12 15:28:55

0

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); 
相關問題