(文字列から double への) 変換で 10 進数の桁数を増やし、強制的に US ロケールを使用するために std::stod() を微調整する方法はありますか?
コンソール モードと GUI モードの両方で実行できる Qt アプリケーションがあります。
if (opt->getFlag( 'c' ) || opt->getFlag( "console" ) ){
ThreadManager modelMainThread;
modelMainThread.runFromConsole(inputFileName,scenarioName);
}
else {
QApplication app(argc, argv);
MainWindow mainWin;
mainWin.show();
return app.exec();
}
このアプリケーション内には、新しい C++11 stod をラップする string to double メソッドがあります。
double s2d ( const string &string_h) const {
try {
return stod(string_h);
} catch (...) {
if (string_h == "") return 0;
else {
cout << "error!" << endl;
}
}
return 0;
}
奇妙なことに、コンソール モードでは、文字列から double への変換では、小数点記号としてドットを含む文字列が想定されますが、GUI モードでは、代わりにコンマを含む文字列が想定されます。さらに、以前は istringstream を使用していたので:
istringstream totalSString( valueAsString );
totalSString >> valueAsDouble;
stod は、結果の double を 3 桁の 10 進数に切り捨て、istringstream よりもはるかに少ないことに気付きました。
では、10 進数の桁数を増やして std::stod に強制的に US ロケールを変換に使用させる方法はありますか?
ありがとう :-)
編集済み:
このスクリプトを試してみると:
// testing stod() ..
vector<string> numbers;
numbers.push_back("123.1234567890");
numbers.push_back("123.1234");
numbers.push_back("123,1234567890");
numbers.push_back("123,1234");
double outd;
for(uint i=0;i<numbers.size();i++){
try {
outd = stod(numbers[i]);
cout << "Conversion passed: " << numbers[i] << " - " << outd << endl;
} catch (...) {
cout << "Conversion DID NOT passed: " << numbers[i] << " - " <<endl;
}
}
私はこれらの結果を得ました:
「コンソール」モード:
Conversion passed: 123.1234567890 - 123.123
Conversion passed: 123.1234 - 123.123
Conversion passed: 123,1234567890 - 123
Conversion passed: 123,1234 - 123
「gui」モード:
Conversion passed: 123.1234567890 - 123
Conversion passed: 123.1234 - 123
Conversion passed: 123,1234567890 - 123.123
Conversion passed: 123,1234 - 123.123
明らかに、stod() の動作に影響を与える何かがあります。