Форматирование числа с плавающей точкой \ двойных чисел до CString с нулевым заполнением и заданным числом цифр - PullRequest
0 голосов
/ 24 ноября 2010

Я ищу простой способ форматирования следующего числа с плавающей запятой \ двойных чисел в строку CString .
Я надеялся использовать CString.Format (), но альтернативы также приветствуются, если только они заканчиваются CString.

3.45
112.2

В следующем формате:

00003450
00112200

Обратите внимание, что должно быть без десятичной точки .
Можно ли это сделать просто, если да, то как?

Ответы [ 4 ]

3 голосов
/ 24 ноября 2010
#include <iomanip>
#include <iostream>

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

должно сработать.

Редактировать: Добавлено округление.Редактировать: Второй тип int () для заглушения скрытых предупреждений: -)

2 голосов
/ 24 ноября 2010

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);
}
1 голос
/ 24 ноября 2010

Вот решение с использованием Boost.Format :

#include <boost/format.hpp>

CString f(double d)
{
   return str(boost::format("%1$=08.0f") % (1000*d)).c_str();
}
1 голос
/ 24 ноября 2010
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());
//...

Refs:

  1. CString :: Format
  2. Printf
...