0

次の float\double 数値を CStringにフォーマットする簡単な方法を探しています。
私は CString.Format() を使用したいと思っていましたが、最終的に CString になる限り、代替手段も歓迎します。

3.45
112.2

次の形式に:

00003450
00112200

小数点がないことに注意してください。
これは簡単にできますか?

4

4 に答える 4

3
#include <iomanip>
#include <iostream>

std::cout << std::setw(8) << std::setfill('0') << int(int(YourNumber)*1000+.5);

トリックを行う必要があります。

編集:丸めを追加しました。編集:あいまいな警告を黙らせるための2番目の int() キャスト:-)

于 2010-11-24T14:52:18.360 に答える
2

f動作します。

void f(double a) {
    const int a1000 = static_cast<int>(a * 1000 + 0.5);
    assert(a1000 < 100000000); 
    const int b = a1000 + 100000000;
    std::stringstream ss;
    ss << b;
    std::cout << ss.str().c_str() + 1; //remove first 1;
}

int main() {
    f(3.45);
    f(112.2);
}
于 2010-11-24T14:45:59.543 に答える
1
CString myString;
myString.Format(_T("%08d"), static_cast<int>(num * 1000.0 + 0.5));

または:

//...
#include <sstream>
#include <iomanip>

using namespace std;

//...
ostringstream s;
s << setfill('0') << setw(8) << static_cast<int>(num * 1000.0 + 0.5);

CString myString(s.str().c_str());
//...

参照:

  1. CString::フォーマット
  2. printf
于 2010-11-24T14:49:25.450 に答える
1

Boost.Formatを使用したソリューションは次のとおりです。

#include <boost/format.hpp>

CString f(double d)
{
   return str(boost::format("%1$=08.0f") % (1000*d)).c_str();
}
于 2010-11-24T15:14:46.103 に答える