2011-02-17 75 views
6

¿Cómo puedo convertir un número (doble) a cadena, con punto decimal personalizado y miles de caracteres de separación?Qt - punto decimal personalizado y separador de miles

He visto QLocale, pero no quiero elegir el país de localización, sino más bien especificar mi propio punto decimal y miles de caracteres de separación.

Gracias

+0

no puedo evitar preguntar - ¿por qué es necesario el uso de separadores personalizados? ¿Estás analizando una lista y te obligan a usar decimales (o puntos) para delimitadores? – spbots

+1

Dado que es cliente de aplicaciones matemáticas, quiere opciones para especificar punto decimal personalizado y miles de caracteres de separador. Por qué estas preguntas irrelevantes ... –

Respuesta

0

Puesto que usted no desea QLOCALE tal vez podría hacer una conversión sencilla (con QString :: número, por ejemplo) y luego vuelva a colocar los caracteres deseados después.

0

bastante horrible, pero hizo el trabajo

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 no soporta la configuración regional personalizada. Sin embargo, para hacer frente a solo grupo y carácter de punto decimal es trivial:

Por cierto, pregunta spbots' no es irrelevante. Más detalles sobre el objetivo siempre ayuda y podría conducir a un enfoque diferente que puede servirle mejor.

2

Así es como lo haces simplemente usando std :: lib (no QT). Defina su propia clase derivada de numpunct que puede especificar punto decimal, carácter de agrupación e incluso el espaciado entre agrupaciones. Imbuerte un ostringstream con una configuración regional que contenga tu faceta. Establezca las banderas en ese ostringstream como desee. Dale salida y saca la cadena de ella.

#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

para los usuarios QML:

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

Aunque este código puede ayudar a resolver el problema, proporciona contexto adicional con respecto a _por qué_ y/o _how_ it responde la pregunta mejoraría significativamente su valor de largo plazo . Por favor [edite] su respuesta para agregar alguna explicación de . –

+0

La respuesta es perfectamente apropiada para mí tal como es. ¡Gracias! – rsp1984

Cuestiones relacionadas