如果我想將兩個逗號解釋爲十進制逗號並將點解釋爲小數點,如何將字符串轉換爲浮點數?字符串到浮點轉換,支持小數點和小數點逗號
該代碼分析我們的客戶創建的文本文件。他們有時使用小數點,有時使用小數點逗號,但不使用千位分隔符。
如果我想將兩個逗號解釋爲十進制逗號並將點解釋爲小數點,如何將字符串轉換爲浮點數?字符串到浮點轉換,支持小數點和小數點逗號
該代碼分析我們的客戶創建的文本文件。他們有時使用小數點,有時使用小數點逗號,但不使用千位分隔符。
使用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());
}
如果你需要應付千位分隔符它會更加棘手。
只要搜索小數逗號','
並將其轉換爲一個'.'
,然後用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>
更改原始的字符串(如果您之後需要原始版本,請不要忘記將其更改或在區域設置副本上工作)。
如果你想這樣做,作爲一個std::istream
的正常閱讀,你會創建一個自定義std::num_get<...>
小的一部分,把它變成一個std::locale
對象,並使用imbue()
安裝到您的流(或通過設置std::locale
作爲創建流之前的全局區域設置)。
我可以創建自定義std :: num_get <...>方面而無需從頭開始編寫自己的浮點解析器? – user763305 2012-02-27 10:10:31
嗯,是的,沒有。浮點解析的一個有趣的部分是將一個字符串轉換成一個'double'。例如, 'strtod()'可以做。不過,你必須把這些角色放在一起。這有點煩人,但並不難。 – 2012-02-27 11:08:56
您不能用小數點替代逗號作爲預處理步驟嗎? iostreams中的本地化方面將是前進的方向,但祝你好運,試圖找出它們...... – Nim 2012-02-27 08:45:00
我同意Nim,每當我這樣做時,我只是在處理之前對輸入數據進行規範化 – 2012-02-27 08:55:03