こんにちは。谷岡です。
std::basic_ostream (ロケールはC)に浮動小数点数を operator<<(float) で出力
すると 1.23e-005 のように指数部の表記が3桁固定になって指数の前に0が付いてし
まいます。
std::basic_ostream::operator<<(float) で浮動小数点数を出力するときに指数の
前に0が付かない書式指定はあるでしょうか?
もしかすると新しい std::num_put ファセットを定義するしかないのでしょうか?
結論を先に言えば、そういう書式指定は無い、でしょう。
ISO/IEC 14882:1998 22.2.2.2.2 num_put virtual functions Table 58
scientific なとき stdio の %e %E に等しい
JIS X3010:2003 7.19.6.1 fprintf
%e %E は指数部分を常に2桁以上の必要な最小桁数で表記する
とあるため。
# よって VC++ が常に3桁で表示するのは C 規格書に違反しています。
自作するしか... 私なら仕様変更で逃げます。
必要なコストの割に得られる結果はそれだけぢゃん。やってられんっつーの。
なるほど納得できました。やはり自分で作るしかありませんね。
ありがとうございました。
解決した後でアレですが
num_put を自作するくらいならむしろ正規表現で
[0-9]*[Ee][+-]0*[1-9] を置換するほうが簡単かもしれません。
# つーか俺ならそうする。
# この程度なら正規表現の必然も無いし...
でけた。
std::string source(1.23e-001);
boost::basic_regex<std::string::value_type> regex(std::string(([0-9]*\\.[0-9]*
[Ee][+-])0*([1-9][0-9]*)));
boost::match_results<std::string::const_iterator> result;
if (boost::regex_match(source, result, regex)) {
std::cout << result.str(1) << result.str(2) << std::endl;
}
# 一時オブジェクトを regex_match に渡しちゃダメなのね...
# regex_match(std::string(1.23e-001)...) と書いたらうまくいかないです。
# って当然なんだけど。