2

double を固定幅の文字列に変換したい。

幅が 10 の場合、double 値をこの幅に丸める必要があります。

たとえば、値 = 102.121323435345 で幅が 10 の場合、この値は次のようになります。

位置==> 0123456789       
           値 = 102.121323

snprintf でこれを実現できますが、同じことを行う C++ ネイティブ コードを探しています。


char buf[125];
snprint(buf, width, "%.6f", value);

以下を使用しようとしましたが、あまり役に立ちません。

 
std::ostringstream oss;
oss << std::fixed << std::setw(10) << std::precision(6) << value;

std::setw は、値の最小幅を保証し、値が幅のサイズを超える場合、値を丸めません。

ありがとう。

4

4 に答える 4

3

次のように、 osteram::widthおよびostream::precision関数を使用して目標を達成できます。

std::ostringstream out;
out.width(10);
out.precision(10);
out << 123.12345678910111213;

幅を尊重するためにポイントの後にゼロを追加することはありませんが、数字の前にスペース (または任意の文字) を追加します。したがって、入力値として 102 を渡すと、'102.000000' の代わりに '102' または '0000000102' (out.fill('0'); を呼び出す場合) が返されます。

于 2009-09-30T07:54:17.313 に答える
2

レキシカルキャストはどうですか?

double x = 102.1213239999;
std::cout << boost::lexical_cast<std::string>(x).substr(0,10);

それはまさにあなたが求めたものではありません。枠にとらわれずに考えてみました。C と C++ のフォーマットの違い
に関する議論については、この質問を見て、 Boost Format Libraryを確認することもできます。

于 2009-09-30T06:03:46.367 に答える
1

それはあなたが望むものですか?ここでは、利用可能な精度の量を計算し、それに応じて ostream を設定します。

    #include <iostream>
    #include <iomanip>

    using namespace std;

    int main(int argc, char* argv[])
    {
    // Input
    double value =  102.1213239999;
    // Calculate limits
    int digits = ( (value<1) ? 1 : int(1+log10(double(abs(value)))) );
    int width = 10;
    int precision = (((width-digits-1)>=0) ? (width-digits-1):0);

    // Display
    cout.setf(ios::fixed);
    cout.precision(precision);
    cout<<setw(10)<<value<<endl;


    return 0;

    }
    OUTPUT: 102.121324

ところで、 digitsを計算する大量の方法が必要な場合は、次のようにします。

于 2009-09-30T05:05:27.533 に答える