2012-02-27 132 views
4

如果我想將兩個逗號解釋爲十進制逗號並將點解釋爲小數點,如何將字符串轉換爲浮點數?字符串到浮點轉換,支持小數點和小數點逗號

該代碼分析我們的客戶創建的文本文件。他們有時使用小數點,有時使用小數點逗號,但不使用千位分隔符。

+3

您不能用小數點替代逗號作爲預處理步驟嗎? iostreams中的本地化方面將是前進的方向,但祝你好運,試圖找出它們...... – Nim 2012-02-27 08:45:00

+0

我同意Nim,每當我這樣做時,我只是在處理之前對輸入數據進行規範化 – 2012-02-27 08:55:03

回答

8

使用std::replace做艱苦的工作:

#include <cstdlib> 
#include <string> 
#include <algorithm> 

double toDouble(std::string s){ 
    std::replace(s.begin(), s.end(), ',', '.'); 
    return std::atof(s.c_str()); 
} 

如果你需要應付千位分隔符它會更加棘手。

3

只要搜索小數逗號','並將其轉換爲一個'.',然後用atof<cstdlib>

#include <cstdlib> 
#include <cstdio> 
#include <string> 

double toDouble(std::string s){ 
    // do not use a reference, since we're going to modify this string 
    // If you do not care about ',' or '.' in your string use a 
    // reference instead. 
    size_t found = s.find(","); 
    if(found != std::string::npos) 
     s[found]='.'; // Change ',' to '.' 
    return std::atof(s.c_str()); 
} 

int main(){ 
    std::string aStr("0.012"); 
    std::string bStr("0,012"); 

    double aDbl = toDouble(aStr); 
    double bDbl = toDouble(bStr); 

    std::printf("%lf %lf\n",aDbl,bDbl); 
    return 0;  
} 

如果您使用C字符串,而不是std::string使用strchr<cstring>更改原始的字符串(如果您之後需要原始版本,請不要忘記將其更改或在區域設置副本上工作)。

+0

要小心兩個符號中的任何一個雖然用作千位分隔符!根據您的輸入,您可以將「100.546,89」轉換爲「100.546.89」,這不是合法號碼。一定要檢查 – Nick 2012-02-27 09:02:17

+1

@Nick:我同意,但是OP已經聲明「他們有時使用小數點,有時使用小數點逗號,但是從未使用千分隔符」,所以不應該發生這個問題。 – Zeta 2012-02-27 09:22:56

0

如果你想這樣做,作爲一個std::istream的正常閱讀,你會創建一個自定義std::num_get<...>小的一部分,把它變成一個std::locale對象,並使用imbue()安裝到您的流(或通過設置std::locale作爲創建流之前的全局區域設置)。

+0

我可以創建自定義std :: num_get <...>方面而無需從頭開始編寫自己的浮點解析器? – user763305 2012-02-27 10:10:31

+0

嗯,是的,沒有。浮點解析的一個有趣的部分是將一個字符串轉換成一個'double'。例如, 'strtod()'可以做。不過,你必須把這些角色放在一起。這有點煩人,但並不難。 – 2012-02-27 11:08:56

相關問題