scanf
、printf
、boost::lexical_cast
の動作とグローバルなアプリケーションロケールに依存します。したがって、それらは入力パラメータに関して決定的ではありません。私は次のようなコードを見た:
std::setlocale(LC_ALL, "C");
scanf(...);
しかし、これはマルチスレッド環境では動作するとは限りません。
解決策は、ユーザーが明示的にロケールを指定できるようにする関数と型を使用することです。
iostream
ストリームオブジェクトを使用すると、ユーザーはロケールをパラメータとして指定でき、これにより確定的な結果が得られます。
std::istringstream istr("10.057");
istr.imbue(std::locale::classic());
double val;
istr >> val;
同様に、boost::format
では、ユーザーがパラメータとしてロケールを指定できます。
using boost::format;
std::string s = str(format("%lf", std::locale::classic()) % 10.057);
stackoverflow questionからの説明も参照してください。