2014-10-31 17 views
6

Tôi không tìm thấy giải pháp để viết số thập phân thấp hơn 1 mà không có '0' trước dấu thập phân. Tôi muốn hiển thị số ở định dạng này: ".1" ," .2" , vv ...C++ cout << không in '0' trước dấu thập phân

sử dụng:

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

luôn cho tôi định dạng như "0.1", "0.2", v.v ...

Tôi làm gì sai? Cảm ơn sự giúp đỡ của bạn

+3

Chuyển đổi nó vào một chuỗi, hãy tháo 0, in chuỗi. – Brandon

Trả lời

4

Bạn cần chuyển đổi nó thành chuỗi và sử dụng nó để in. Không có cách nào để một luồng in một điểm nổi mà không có số 0 đứng đầu, nếu có.

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; 
} 

Hãy thử nó online!

EDIT: Một số giải pháp bạn có thể thích hơn sẽ là loại tùy chỉnh nổi. ví dụ.

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; 
}; 

Hãy thử nó online!

+0

Một số cải tiến: (1) sử dụng 'double', (2) để kiểm tra giá trị âm nếu đối số là âm, nếu tự gọi với số-và thêm dấu gạch nối, (3) cho kết quả chuỗi kiểm tra còn lại thay vì giá trị ban đầu, (4) không sử dụng tiền tố 'get' (như' getin', 'getcos',' getqrt', ouch). –

+0

Cảm ơn tất cả, Đây là những gì tôi lo sợ, tôi hy vọng một giải pháp đẹp hơn ... Tôi sẽ sử dụng chuyển đổi chuỗi. – user3094558

+0

hãy xem chỉnh sửa của tôi :) – NaCl

0

Trong thư viện iomanip, có vẻ như không có chức năng nào để cắt 0 trước cout. Bạn cần phải chuyển đổi đầu ra thành chuỗi.

Đây là giải pháp của tôi:

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; 
Các vấn đề liên quan