2012-02-27 28 views
4

カンマを小数点として解釈する場合、文字列を浮動小数点数に変換するにはどうすればよいですか?小数点と小数点の両方をサポートする浮動小数点変換の文字列

コードは、お客様が作成したテキストファイルを解析します。時には小数点や時には小数点記号を使用することもありますが、決して千単位の区切り記号は使用しません。

+3

前処理ステップとして、小数点の代わりにコンマを使用することはできませんか? iostreamのローカライゼーションファセットは将来の道ですが、それらを理解しようとすると幸運です... – Nim

+0

私はNimに同意します。私はこれを行うたびに、処理する前に入力データを正規化します。 –

答えて

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

だけ<cstdlib>からatofを使用し、その後、小数コンマを検索',''.'に変換:あなたがあなたの元の文字列を変更する<cstring>からではなくstd::string使用strchrのC文字列を使用する場合は

#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;  
} 

(後で元のバージョンが必要な場合は、それを元に戻すか、ロケールコピーで作業することを忘れないでください)。

+0

2つのシンボル何千ものセパレータとして使用されます!あなたの入力に応じて、 '100.546,89'を' 100.546.89'に変換することができます。これは正当な番号ではありません。 – Nick

+1

@ニックを確認してください:私は同意しますが、OPは「時には小数点と小数点を使用することがありますが、決して1000個の区切り記号は使用しません」と述べています。 – Zeta

0

あなたがstd::istreamの通常の読み出しの一部としてそれをしたい場合は、カスタムstd::num_get<...>面を作成std::localeオブジェクトにそれを置く、としてstd::localeを設定することにより、imbue()(またはを使用して、ストリームにそれをインストールしますストリームを作成する前にグローバルロケール)。

+0

独自の浮動小数点パーサーをゼロから作成せずにカスタムstd :: num_get <...>ファセットを作成できますか? – user763305

+0

さて、はい、いいえ。浮動小数点解析の興味深い部分は、文字列を 'double'に変換することです。例えば、 'strtod()'ができます。しかし、あなたはこのための文字を一緒に置くことになります。これは少し面倒ですが、それほど難しくありません。 –

関連する問題