2017-11-05 17 views
0

私はより大きなプロジェクト(g++.exe (MinGW.org GCC-6.3.0-1) 6.3.0)をコンパイルするCMakeとMinGWを使用しています。私はブーストがロケールを生成した設定開始時にMinGWの数値書式設定が変更されました

とフォーマットを試してみてください。

//Global 
std::locale myLoc; 

    // Init function 
    std::locale newLocale(boost::locale::generator().generate("C")); 
    std::locale::global(newLocale); 
    std::cerr << 1.1234 << std::endl; 
    myLoc = std::locale(); 

後、私は再び出力に番号をしたいが、突然、私はドイツのシステム上だと私は別の小数点(,を持っています)しかし、ロケールは変更されていないようです。

std::cerr << (std::locale() == myLoc) << std::endl; 
std::cerr << boost::lexical_cast<std::string>(1.1234) << std::endl; 
std::cerr << std::use_facet<std::numpunct<char> >(std::locale()).decimal_point() << std::endl; 

出力は次のとおりです。

1.1234 
1 
1,1234 
. 

だから、全部で:フォーマットは、最初は動作しますが、ロケールはまだ同じである、decimal_pointはまだ.を返しますが、私は,を取得します。これはどのように可能ですか?

これをMWEで再現することはできませんでしたが、これを調べるヒントがあれば感謝します。

+0

boost :: lexical_castのような匂いは、C++ロケールの代わりにCロケールを使用します。まあ、それは彼らが再び修正することはできませんバグです:) –

答えて

0

setLocalestd::localeはお互いに独立しています。

私のコードのどこかに問題があったsetLocaleが見つかりました。具体的には、言語を変更するためにsetLocaleが必要なカスタムgettextの実装を使用していました。これはもちろん望ましいことですが、副作用として数字の書式も変更されます。これは、setLocaleのパラメータがLC_MESSAGESでないためです。

SO 2溶液:

  1. 例えば持つC++ロケールをリセットstd::locale::global(std::locale::classic());または呼び出し後の最初の呼び出しsetLocale
  2. 出力に依存する場合はlexical_castを使用しないでください。例:明示的なロケールでboost.Localeを使用します。
関連する問題