0からの、超初心者C++相談室at TECH0からの、超初心者C++相談室 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト767:デフォルトの名無しさん 24/01/28 11:52:43.80 W0uCnQb3.net 質問なのですがどんな環境(ロケール設定)のPCで動かしても 数値や時刻の入出力を修飾無し(12345 が 12,345 になったりしない)にする完璧な方法って次の3行で良い? setlocale(LC_ALL, ""); // printf()、scanf()に反映 _wsetlocale(LC_ALL, L""); // wprintf()、wscanf()に反映 (※ 環境依存。左記はWindowsの場合 std::locale::global(std::locale("", std::locale::all)); // cout、wcout、cin、wcin、ostringstream、wostringstream、...etc. C++の全部に反映 あとなんか実験する限り cout.imbue(std::locale("")); std::locale::global(std::locale("", std::locale::all)); とするとcoutが修飾有りとなり、cout.imbue()で与えた設定をstd::locale::global()が上書きしないように見えるのですがそういうもの? 768:はちみつ餃子 24/01/28 13:12:39.75 hRRbWEE/.net >>762 言語仕様通りならそれらの関数を呼び出さないようにすれば環境に固有の表現の変換はしない。 std::setlocale の設定が C の標準関数の挙動に影響するのはその通り。 ただし、様々な環境での「同じ動作」を期待するなら "C" を与えるべき。 空の文字列を渡した場合には環境に固有の設定であり、通常はシステムの設定が反映される。 プログラムは起動したときに setlocale(LC_ALL, "C"); 相当の状態なので、普通は書く必要もない。 std::locale::global での設定は C++ の標準ライブラリの挙動に影響するだけでなく std::setlocale での設定にも反映されるので両方を呼び出す必要はない。 これもプログラム起動時のロケール設定は "C" 相当になっているのでそれで良ければ呼び出す必要もない。 ただし、 std::locale::global に与える設定が名前を持たない場合 (つまり std::locale("") のような場合) は std::setlocale 相当の変更もするかどうかは規定されない。 imbue はストリームにロケールを結びつけるのでグローバル設定とは独立して機能する。 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch