Format decimal with comma and thousand with dot

12

How can I format a float into the Brazilian value (price) format?

Example: in php number_format($float,2,',','.') separates the decimal with comma and the unit of thousand with point.

    
asked by anonymous 19.03.2014 / 17:59

2 answers

12

Use QLocale

If the formatting you want is used in a particular language, you can format your number by setting Qlocate (English) with the language that contains the intended formatting:

// a definição actual em uso
QLocale loc = QLocale::system();

// Recolher a formatação de números utilizada para a língua Portuguesa
QLocale brasil(QLocale::Portuguese);
loc.setNumberOptions(brasil.numberOptions());

// Define como valor por defeito
QLocale::setDefault(loc);

From here the formatting of numbers should already be as it is used by the Portuguese language.

    
19.03.2014 / 19:27
6

The solution using the standard C ++ library looks like this:

First you need to create a specialization of the std :: numpunct class and override two methods in order to implement specific behavior for our currency.

#include <iostream>
#include <iomanip>
#include <locale>
using namespace std;

class BRL : public numpunct<char>
{
    protected:

    //separador de milhar
    virtual char do_thousands_sep() const
    {
        return ',';
    }

    //padrão de agrupamento dos milhares, de 3 em 3
    virtual std::string do_grouping() const
    {
        return "";
    }
};

So to use, do the following:

int main(int argc, char* argv[]){
    float _valor = 1022.33;

    //instanciando um locale que utilizará a especialização de numpunct
    locale br(locale(), new BRL());

    //configurar no cout o locale que será utilizado nas formatações
    cout.imbue(br);

    //setprecistion() é necessário para configurar precisão de apenas duas casas decimais
    //fixed é necessário para que o valor não seja impresso como notação científica.
    cout << "R$ " << setprecision(2) << fixed <<  _valor;

    return 0;
}

The output on the console looks like this:

R$ 1,022.33

Full version on ideone .

    
19.03.2014 / 19:40