2011-02-17 20 views
6

Come convertire un numero (doppio) in stringa, con punto decimale personalizzato e migliaia di caratteri separatori?Qt - separatore decimale personalizzato e separatore di migliaia

Ho visto QLocale, ma non voglio scegliere il paese di localizzazione, ma piuttosto specificare il mio punto decimale e mille caratteri separatori.

Grazie

+0

non posso fare a meno di chiedere - perché è necessario utilizzare separatori personalizzati? Stai analizzando un elenco e sei costretto a utilizzare decimali (o punti) per delimitatori? – spbots

+1

Dato che il client di app di matematica desidera opzioni per specificare il punto decimale personalizzato e mille caratteri di separazione. Perché queste domande irrilevanti ... –

risposta

0

Dal momento che non si vuole QLOCALE forse si poteva fare una semplice conversione (con QString :: il numero, per esempio) e quindi sostituire i caratteri desiderati in seguito.

0

abbastanza orribile, ma ha ottenuto il lavoro fatto

double doubleNumber = 5234556.3545; 
int precision = 2; 

QString stringNumber = QString::number(doubleNumber, 'f', precision); 

for(int point = 0, i = (stringNumber.lastIndexOf('.') == -1 ? stringNumber.length() : stringNumber.lastIndexOf('.')); i > 0; --i, ++point) 
{ 
    if(point != 0 && point % 3 == 0) 
    { 
     stringNumber.insert(i, ','); 
    } 
} 
9

Qt non supporta locale personalizzata. Ma a che fare con un solo gruppo e caratteri punto decimale è banale:

BTW, domanda spbots' non è irrilevante. Ulteriori dettagli sull'obiettivo sono sempre utili e potrebbero portare a un approccio diverso che potrebbe servire meglio.

2

Ecco come si fa semplicemente usando std :: lib (no QT). Definisci la tua classe derivata dal numpunk che può specificare il punto decimale, il carattere di raggruppamento e persino la spaziatura tra i raggruppamenti. Imbue un ostringstream con un locale contenente il tuo aspetto. Imposta i flag su quel ostringstream come desideri. Esegui l'output e ottieni la stringa da esso.

#include <locale> 
#include <sstream> 
#include <iostream> 

class my_punct 
    : public std::numpunct<char> 
{ 
protected: 
    virtual char do_decimal_point() const {return ',';} 
    virtual char do_thousands_sep() const {return '.';} 
    virtual std::string do_grouping() const {return std::string("\2\3");} 
}; 

int main() 
{ 
    std::ostringstream os; 
    os.imbue(std::locale(os.getloc(), new my_punct)); 
    os.precision(2); 
    fixed(os); 
    double x = 123456789.12; 
    os << x; 
    std::string s = os.str(); 
    std::cout << s << '\n'; 
} 

1.234.567.89,12

1

per gli utenti QML:

function thousandSeparator(input){ 
    return input.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"); 
} 
+0

Sebbene questo codice possa essere d'aiuto per risolvere il problema, fornendo un ulteriore contesto riguardo _why_ e/o _how_ it risponde alla domanda migliorerebbe significativamente il suo valore a lungo termine . Per favore [modifica] la tua risposta per aggiungere qualche spiegazione . –

+0

La risposta è perfettamente appropriata per me così com'è. Grazie! – rsp1984

Problemi correlati