2014-10-31 12 views
6

Non ho trovato la soluzione per scrivere il numero decimale inferiore a 1 senza lo '0' prima del punto decimale. Voglio visualizzare i numeri in questo formato: ".1" ," 0,2" , ecc ...C++ cout << non stampare '0' prima del punto decimale

utilizzando:

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

sempre darmi formati come "0.1", "0.2", ecc ...

Cosa devo fare? Grazie per l'aiuto

+3

convertirlo in una stringa, rimuovere il 0, stampare la stringa. – Brandon

risposta

4

È necessario convertirlo in una stringa e utilizzarlo per la stampa. Non c'è modo per un flusso di stampare un punto mobile senza uno zero iniziale, se ce n'è uno.

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

Provalo online!

MODIFICA: Qualche soluzione che potrebbe piacere di più sarebbe un tipo di flottante personalizzato. per esempio.

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

Provalo online!

+0

Alcuni miglioramenti: (1) usa 'double', (2) per il controllo del valore negativo se l'argomento è negativo, in tal caso chiama self con -numero e aggiungi trattino, (3) per il resto verifica il risultato della stringa piuttosto che il valore originale, (4) non usare un prefisso 'get' (come' getin', 'getcos',' getsqrt', ouch). –

+0

Grazie a tutti, Questo è quello che temevo, speravo in una soluzione migliore ... Userò la conversione delle stringhe. – user3094558

+0

dai un'occhiata alla mia modifica :) – NaCl

0

Nella libreria iomanip, sembra che non funzioni il 0 prima dello cout. Devi convertire l'output in stringa.

Ecco la mia soluzione:

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; 
Problemi correlati