カンマを小数点として解釈する場合、文字列を浮動小数点数に変換するにはどうすればよいですか?小数点と小数点の両方をサポートする浮動小数点変換の文字列
コードは、お客様が作成したテキストファイルを解析します。時には小数点や時には小数点記号を使用することもありますが、決して千単位の区切り記号は使用しません。
カンマを小数点として解釈する場合、文字列を浮動小数点数に変換するにはどうすればよいですか?小数点と小数点の両方をサポートする浮動小数点変換の文字列
コードは、お客様が作成したテキストファイルを解析します。時には小数点や時には小数点記号を使用することもありますが、決して千単位の区切り記号は使用しません。
使用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());
}
を。
だけ<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;
}
(後で元のバージョンが必要な場合は、それを元に戻すか、ロケールコピーで作業することを忘れないでください)。
あなたがstd::istream
の通常の読み出しの一部としてそれをしたい場合は、カスタムstd::num_get<...>
面を作成std::locale
オブジェクトにそれを置く、としてstd::locale
を設定することにより、imbue()
(またはを使用して、ストリームにそれをインストールしますストリームを作成する前にグローバルロケール)。
独自の浮動小数点パーサーをゼロから作成せずにカスタムstd :: num_get <...>ファセットを作成できますか? – user763305
さて、はい、いいえ。浮動小数点解析の興味深い部分は、文字列を 'double'に変換することです。例えば、 'strtod()'ができます。しかし、あなたはこのための文字を一緒に置くことになります。これは少し面倒ですが、それほど難しくありません。 –
前処理ステップとして、小数点の代わりにコンマを使用することはできませんか? iostreamのローカライゼーションファセットは将来の道ですが、それらを理解しようとすると幸運です... – Nim
私はNimに同意します。私はこれを行うたびに、処理する前に入力データを正規化します。 –