2

に変換するlexical_castときに小数点を保持する独自の記述を作成したいと思います。だから私はフラグを使用して設定しています:doublestd::stringostringstreamstd::ios::showpoint

#include <string>
#include <iostream>
#include <boost/lexical_cast.hpp>

template <typename Source>
std::string my_string_cast(Source arg){
   std::ostringstream interpreter;
   interpreter.precision(std::numeric_limits<Source>::digits10);
   interpreter.setf(std::ios::showpoint);
   interpreter << arg;
   return interpreter.str();
}

int main(int argc, char** argv) {
   std::cout << my_string_cast(1.0) << std::endl;
   std::cout << my_string_cast(5.6) << std::endl;
   std::cout << my_string_cast(1.0/3.0) << std::endl;
   return 0;
}

ただし、これは不要な0桁を出力します。これは、設定から期待する動作ですが、次のようにはなりstd::ios::fixedませんstd::ios::showpoint

1.00000000000000
5.60000000000000
0.333333333333333

設定せずstd::ios::showpoint

1
5.6
0.333333333333333

しかし、私はこのようなものが欲しいです:

1.0
5.6
0.333333333333333

簡単な方法はありますか?

4

2 に答える 2

1

あなたが望んでいることは、私にはかなりカスタムな振る舞いのように思えます。

これは最善の方法ではないかもしれませんが、すべての数字をostringstreamに出力してから、ストリーム内の最後の「0」以外の文字を検索することができます。ストリームの終了位置をその位置に設定します。

次のようなもの:

size_t endPos = interpreter.str().find_last_of("0");  
size_t begPos = interpreter.str().find_first_of(".") +2;  
if( endPos < begPos )  
  return interpreter.str().substr(0, begPos);  
else  
  return interpreter.str().substr(0, endPos);  
于 2011-06-03T19:22:35.307 に答える
0

printfstdライブラリのコードを長い間調べた後、すべてが何らかの型関数に渡されたようです__builtin_vsnprintf(__out, __size, __fmt, __args)。フォーマット文字列__fmtは、オブジェクトに設定されたフラグに応じて設定され、ostringstream次を使用して照会できます。

std::ostringstream s;
// ...
char format[50];
std::__num_base::_S_format_float(s,format,'\0');

デフォルトのフォーマット文字列は、が印刷される場所と印刷される場所の%.*gように使用されます。他のフラグについては、次のようになります。printf("%.*g",precision,x);precisionintxdouble

s.setf(std::ios::fixed);      // %.*f
s.setf(std::ios::showpoint);  // %#.*g

ただし、この形式%#gは小数点を保持するだけでなく、すべての後続ゼロも保持します。ドキュメントは、と#組み合わせたの使用法について述べていますg

"printf" will always print out a decimal point and trailing zeros will not
be removed; usually 'g' and 'G' remove trailing zeros.

printf残念ながら、他のフォーマット文字列と同じように動作するものは見つかりません%gが、常に小数点を保持しているので、dschaefferの答えに沿ったものが最適かもしれません。

于 2011-06-05T09:16:51.817 に答える