std::basic_ostream の浮動小数点数の指数表記

[戻る]
谷岡 2005/01/11(火) 14:11:34
こんにちは。谷岡です。

std::basic_ostream (ロケールは"C")に浮動小数点数を operator<<(float) で出力
すると 1.23e-005 のように指数部の表記が3桁固定になって指数の前に0が付いてし
まいます。

std::basic_ostream::operator<<(float) で浮動小数点数を出力するときに指数の
前に0が付かない書式指定はあるでしょうか?
もしかすると新しい std::num_put ファセットを定義するしかないのでしょうか?

tetrapod 2005/01/11(火) 14:59:46
結論を先に言えば、そういう書式指定は無い、でしょう。

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 規格書に違反しています。

自作するしか... 私なら仕様変更で逃げます。
必要なコストの割に得られる結果はそれだけぢゃん。やってられんっつーの。

谷岡 2005/01/11(火) 18:19:45
[[解決]]
なるほど納得できました。やはり自分で作るしかありませんね。
ありがとうございました。

tetrapod 2005/01/11(火) 18:34:31
解決した後でアレですが

num_put を自作するくらいならむしろ正規表現で
[0-9]*[Ee][+-]0*[1-9] を置換するほうが簡単かもしれません。
# つーか俺ならそうする。
# この程度なら正規表現の必然も無いし...

tetrapod 2005/01/11(火) 19:12:37
でけた。

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")...) と書いたらうまくいかないです。
# って当然なんだけど。

古いスレッドには追加発言できません。