std::basic_ostream の浮動小数点数の指数表記 – プログラミング – Home

通知
すべてクリア

[解決済] std::basic_ostream の浮動小数点数の指数表記


谷岡
 谷岡
(@谷岡)
ゲスト
結合: 22年前
投稿: 33
Topic starter  

こんにちは。谷岡です。

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

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


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

結論を先に言えば、そういう書式指定は無い、でしょう。

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

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


返信引用
谷岡
 谷岡
(@谷岡)
ゲスト
結合: 22年前
投稿: 33
Topic starter  

なるほど納得できました。やはり自分で作るしかありませんね。
ありがとうございました。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

解決した後でアレですが

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

でけた。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました