2014-10-31 3 views
6

Я не нашел решение написать десятичное число, меньшее 1 без «0» до десятичной точки. Я хочу, чтобы отобразить числа в следующем формате: ".1" ," .2" , и т.д ...C++ cout << не печатать '0' перед десятичной точкой

с помощью:

std::cout << std::setw(2) << std::setprecision(1) << std::fixed << number; 

всегда дают мне форматы, такие как "0,1", "0,2", и т. д.

Что я не так? Спасибо за вашу помощь

+3

Преобразование в строку, удалить 0, напечатать строку. – Brandon

ответ

4

Вам необходимо преобразовать его в строку и использовать ее для печати. Нет возможности для потока для печати плавающей точкой без начального нуля, если таковой имеется.

std::string getFloatWithoutLeadingZero(float val) 
{ 
    //converting the number to a string 
    //with your specified flags 

    std::stringstream ss; 
    ss << std::setw(2) << std::setprecision(1); 
    ss << std::fixed << val; 
    std::string str = ss.str(); 

    if(val > 0.f && val < 1.f) 
    { 
     //Checking if we have no leading minus sign 

     return str.substr(1, str.size()-1); 
    } 
    else if(val < 0.f && val > -1.f) 
    { 
     //Checking if we have a leading minus sign 

     return "-" + str.substr(2, str.size()-1); 
    } 

    //The number simply hasn't a leading zero 
    return str; 
} 

Попробуйте online!

РЕДАКТИРОВАТЬ: Некоторое решение, которое может вам понравиться, было бы обычным поплавковым типом. например

class MyFloat 
{ 
public: 
    MyFloat(float val = 0) : _val(val) 
    {} 

    friend std::ostream& operator<<(std::ostream& os, const MyFloat& rhs) 
    { os << MyFloat::noLeadingZero(rhs._val, os); } 

private: 
    static std::string noLeadingZero(float val, std::ostream& os) 
    { 
     std::stringstream ss; 
     ss.copyfmt(os); 
     ss << val; 
     std::string str = ss.str(); 

     if(val > 0.f && val < 1.f) 
      return str.substr(1, str.size()-1); 
     else if(val < 0.f && val > -1.f) 
      return "-" + str.substr(2, str.size()-1); 

     return str; 
    } 
    float _val; 
}; 

Попробуйте online!

+0

Некоторые улучшения: (1) используйте «double», (2) для отрицательного значения, проверьте, является ли аргумент отрицательным, если он вызывает self с номером -number и добавляет дефис, (3) для результата проверки остальной строки вместо исходного значения (4) не используйте префикс 'get' (например,' getin', 'getcos',' getqrt', ouch). –

+0

Спасибо, Это то, чего я боялся, я надеялся на лучшее решение ... Я буду использовать преобразование строк. – user3094558

+0

взгляните на мое редактирование :) – NaCl

0

В библиотеке iomanip, кажется, нет функции для обрезки 0 до cout. Вам нужно преобразовать вывод в строку.

Вот мое решение:

double number=3.142, n; //n=3 
char s[2]; 
sprintf (s, ".%d", int(modf(number, &n)*10)); 
        //modf(number, &n)=0.142 s='.1' 
cout << s; 
Смежные вопросы