9

(文字列から 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() の動作に影響を与える何かがあります。

4

4 に答える 4

5

std::stodおよびその親族は、文字列から数値型への簡単で迅速な変換を提供するように設計されています。(完全な開示: これは私の設計です) つまり、いいえ、ロケールはありません。あなたが見たもの、それがあなたの手に入れたものだ。

于 2012-09-07T12:00:47.807 に答える
3

std::stodstd::stringは、 a を doubleに変換する一般的な方法です。より具体的なものが必要な場合は、自分で実装する必要があります。

例えば:

double my_stod(const std::string &valueAsString) {
    istringstream totalSString( valueAsString );
    double valueAsDouble;
    // maybe use some manipulators
    totalSString >> valueAsDouble;
    if(!totalSString)
        throw std::runtime_error("Error converting to double");    
    return valueAsDouble;
}
于 2012-09-07T11:26:05.790 に答える