Problem in the price formatting function

1

I have a preformatted value of 6.5 . If I put this function, it returns 0,65 . If I put 19.5 it returns 1,95 .

Why does this happen?

function formataReal(numero)
{
    var tmp = numero + '';
    var neg = false;

    if (tmp - (Math.round(numero)) == 0) {
      tmp = tmp + '00';
    }

    if (tmp.indexOf(".")) {
      tmp = tmp.replace(".", "");
    }

    if (tmp.indexOf("-") == 0) {
      neg = true;
      tmp = tmp.replace("-", "");
    }

    if (tmp.length == 1) tmp = "0" + tmp

    tmp = tmp.replace(/([0-9]{2})$/g, ",$1");

    if (tmp.length > 6)
    tmp = tmp.replace(/([0-9]{3}),([0-9]{2}$)/g, ".$1,$2");

    if (tmp.length > 9)
    tmp = tmp.replace(/([0-9]{3}).([0-9]{3}),([0-9]{2}$)/g, ".$1.$2,$3");

    if (tmp.length = 12)
    tmp = tmp.replace(/([0-9]{3}).([0-9]{3}).([0-9]{3}),([0-9]{2}$)/g, ".$1.$2.$3,$4");

    if (tmp.length > 12)
    tmp = tmp.replace(/([0-9]{3}).([0-9]{3}).([0-9]{3}).([0-9]{3}),([0-9]{2}$)/g, ".$1.$2.$3.$4,$5");

    if (tmp.indexOf(".") == 0) tmp = tmp.replace(".", "");
    if (tmp.indexOf(",") == 0) tmp = tmp.replace(",", "0,");

    return (neg ? '-' + tmp : tmp);
}
    
asked by anonymous 10.08.2017 / 16:05

3 answers

0

This function is a disaster, with a line you can do this, I suggested that you use this, it always worked for me:

function formatNumber(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

Or if you prefer this also works beautifully:

function formatNumber(x) {
    var parts = x.toString().split(".");
    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    return parts.join(".");
}
    
10.08.2017 / 16:12
3

You can use Intl.NumberFormat to convert values to monetary format.

const Money = Intl.NumberFormat('BRL', {
    style: 'currency',
    currency: 'BRL',
});
Money.format(19.50); // Saida R$19,50
Money.format(1550); // Saida R$1.550,00
Money.format(0.25); // Saida R$0,25

Do not forget to check compatibility at all times.

    
10.08.2017 / 16:23
1

In JavaScript there is the native method toLocaleString() to work with monetary values. This already meets your specific needs by making use of a locale to format the output value:

var numero = 123456.789;
var formatado = numero.toLocaleString('pt-BR', {maximumFractionDigits: 2 });

// Debug
document.getElementById("resultado").textContent = formatado;
<span id="resultado"></span>

Using the maximumFractionDigits option, you can specify the number of decimal places you want.

    
10.08.2017 / 16:56