Como converter uma string de moeda para um duplo com jQuery ou Javascript?


237

Eu tenho uma caixa de texto que terá uma string de moeda e, em seguida, preciso convertê-la em um dobro para executar algumas operações nela.

"$1,100.00"1100.00

Isso precisa ocorrer no lado do cliente. Não tenho escolha a não ser deixar a string da moeda como uma string da moeda como entrada, mas preciso convertê-la em um dobro para permitir algumas operações matemáticas.

Respostas:


480

Remova todos os não pontos / dígitos:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));

4
Parece que isso só funciona onde há um .00rastro. Caso contrário, representações válidas da moeda, como "$ 1100" e "$ 1100". será reduzido em duas ordens de magnitude.
9788 Brian Hunt

19
Lembre-se de que isso depende da localidade, pois outras localidades usam ',' para decimais (por exemplo, 1.100,00 €). Algumas outras localidades ainda usam números padrão diferentes de dígitos por grupo (como três casas decimais).
22413

8
Para manipular números negativos na string, adicionei um '-' à lista de caracteres a serem aceitos, ou seja, .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland

4
Lembre-se também de que alguns aplicativos de contabilidade colocam números entre parênteses para indicar valores negativos. por exemplo: ($ 5,00) = - $ 5,00
Dave L

1
Sei que posso demorar vários anos para responder aqui, mas você também precisa ter cuidado se "moeda = 0". você receberá um erro de javascript dizendo que currency.replace não é uma função. Acabei de adicionar uma verificação simples se currency = 0 para evitar isso.
Allen


20

Use um regex para remover a formatação (dólar e vírgula) e use parseFloat para converter a sequência em um número de ponto flutuante.`

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;

8
Vale ressaltar que você não deve usar float para aplicativos que não sejam 'Toy' ao adicionar moedas. Você terminará com totais não exatos.
Ally

6
Você ficará surpreso e infeliz quando o parseFloat ("151.20" * 100) fornecer 15119.999999999998, mas o parseFloat ("151.40" * 100) fornecer o 15140. Nunca use o parseFloat por dinheiro. Use bibliotecas específicas para lidar com dinheiro, como accounting.js ou qualquer uma das outras sugeridas aqui.
bambery

15

Eu sei que esta é uma pergunta antiga, mas queria dar uma opção adicional.

O jQuery Globalize oferece a capacidade de analisar um formato específico de cultura para um float.

https://github.com/jquery/globalize

Dada uma sequência "$ 13.042,00" e Globalizar definido como en-US:

Globalize.culture("en-US");

Você pode analisar o valor flutuante da seguinte maneira:

var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));

Isso lhe dará:

13042.00

E permite que você trabalhe com outras culturas.


10

Sei que essa é uma pergunta antiga, mas a resposta do CMS parece ter uma pequena falha: só funciona se o formato da moeda usar "." como separador decimal. Por exemplo, se você precisar trabalhar com rublos russos, a sequência terá a seguinte aparência: "1 000,00 rub".

Minha solução é muito menos elegante que a do CMS, mas deve funcionar.

var currency = "1 000,00 rub."; //it works for US-style currency strings as well
var cur_re = /\D*(\d+|\d.*?\d)(?:\D+(\d{2}))?\D*$/;
var parts = cur_re.exec(currency);
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));
console.log(number.toFixed(2));

Premissas:

  • o valor da moeda usa notação decimal
  • não há dígitos na string que não façam parte do valor da moeda
  • o valor da moeda contém 0 ou 2 dígitos em sua parte fracionária *

O regexp pode até lidar com algo como "1.999 dólares e 99 centavos", embora não seja um recurso pretendido e não deva ser invocado.

Espero que isso ajude alguém.


Obrigado. Melhor resposta. Simples e poderoso. Eu usaria com (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $ para obter a moeda e - por centavos. Assim, você pode analisar seqüências de caracteres como 1.000, - € também. A moeda estará nas partes [1] ou parte [4] e a parte [3] inclui centavos como número ou -. Do que você pode normalizar a string como quiser.
CyberAleks

Isso é muito ruim e perigoso, isso multiplica números menos de 10 por 100. Eu o usei tolamente antes de testar todos os números com ele :(
sheavens

@ sheavens obrigado por denunciá-lo. Desculpas por corrigi-lo tão tarde, mas a nova versão também funciona para essas somas.
Vindicar


6

// "10.000.500,61 TL" price_to_number => 10000500.61

// "10000500.62" number_to_price => 10.000.500,62

JS FIDDLE: https://jsfiddle.net/Limitlessisa/oxhgd32c/

var price="10.000.500,61 TL";
document.getElementById("demo1").innerHTML = price_to_number(price);

var numberPrice="10000500.62";
document.getElementById("demo2").innerHTML = number_to_price(numberPrice);

function price_to_number(v){
    if(!v){return 0;}
    v=v.split('.').join('');
    v=v.split(',').join('.');
    return Number(v.replace(/[^0-9.]/g, ""));
}

function number_to_price(v){
    if(v==0){return '0,00';}
    v=parseFloat(v);
    v=v.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
    v=v.split('.').join('*').split(',').join('.').split('*').join(',');
    return v;
}


3

Esta é a minha função. Funciona com todas as moedas.

function toFloat(num) {
    dotPos = num.indexOf('.');
    commaPos = num.indexOf(',');

    if (dotPos < 0)
        dotPos = 0;

    if (commaPos < 0)
        commaPos = 0;

    if ((dotPos > commaPos) && dotPos)
        sep = dotPos;
    else {
        if ((commaPos > dotPos) && commaPos)
            sep = commaPos;
        else
            sep = false;
    }

    if (sep == false)
        return parseFloat(num.replace(/[^\d]/g, ""));

    return parseFloat(
        num.substr(0, sep).replace(/[^\d]/g, "") + '.' + 
        num.substr(sep+1, num.length).replace(/[^0-9]/, "")
    );

}

Uso: toFloat("$1,100.00")outoFloat("1,100.00$")


3

Você pode tentar isso

var str = "$1,112.12";
str = str.replace(",", "");
str = str.replace("$", "");
console.log(parseFloat(str));


2
jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");

saída é: Rs. 39,00

use jquery.glob.js,
    jQuery.glob.all.js

0
    $ 150.00
    Fr. 150.00
     689.00

Testei acima de três símbolos de moeda. Você também pode fazer isso por outras pessoas.

    var price = Fr. 150.00;
    var priceFloat = price.replace(/[^\d\.]/g, '');

A expressão acima da expressão regular removerá tudo que não seja um dígito ou um ponto final.

    console.log('priceFloat : '+priceFloat);

    output will be like  priceFloat : .150.00

errado, verifique o índice de "." depois divida isso e obtenha o resultado adequado.

    if (priceFloat.indexOf('.') == 0) {
            priceFloat = parseFloat(priceFloat.split('.')[1]);
    }else{
            priceFloat = parseFloat(priceFloat);
    }

0
function NumberConvertToDecimal (number) {
    if (number == 0) {
       return '0.00'; 
    }
    number = parseFloat(number);
    number = number.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1");
    number = number.split('.').join('*').split('*').join('.');
    return number;
}

0
var parseCurrency = function (e) {
    if (typeof (e) === 'number') return e;
    if (typeof (e) === 'string') {
        var str = e.trim();
        var value = Number(e.replace(/[^0-9.-]+/g, ""));
        return str.startsWith('(') && str.endsWith(')') ? -value: value;
    }

    return e;
} 

0

Esta função deve funcionar independentemente das configurações de localidade e moeda:

function getNumPrice(price, decimalpoint) {
    var p = price.split(decimalpoint);
    for (var i=0;i<p.length;i++) p[i] = p[i].replace(/\D/g,'');
    return p.join('.');
}

Isso pressupõe que você conhece o caractere de ponto decimal (no meu caso, a localidade é definida no PHP, então eu entendi <?php echo cms_function_to_get_decimal_point(); ?>).


0

Isso funcionou para mim e abrange a maioria dos casos extremos :)

function toFloat(num) {
  const cleanStr = String(num).replace(/[^0-9.,]/g, '');
  let dotPos = cleanStr.indexOf('.');
  let commaPos = cleanStr.indexOf(',');

  if (dotPos < 0) dotPos = 0;

  if (commaPos < 0) commaPos = 0;

  const dotSplit = cleanStr.split('.');
  const commaSplit = cleanStr.split(',');

  const isDecimalDot = dotPos
    && (
      (commaPos && dotPos > commaPos)
      || (!commaPos && dotSplit[dotSplit.length - 1].length === 2)
    );

  const isDecimalComma = commaPos
    && (
      (dotPos && dotPos < commaPos)
      || (!dotPos && commaSplit[commaSplit.length - 1].length === 2)
    );

  let integerPart = cleanStr;
  let decimalPart = '0';
  if (isDecimalComma) {
    integerPart = commaSplit[0];
    decimalPart = commaSplit[1];
  }
  if (isDecimalDot) {
    integerPart = dotSplit[0];
    decimalPart = dotSplit[1];
  }

  return parseFloat(
    `${integerPart.replace(/[^0-9]/g, '')}.${decimalPart.replace(/[^0-9]/g, '')}`,
  );
}
toFloat('USD 1,500.00'); // 1500
toFloat('USD 1,500'); // 1500
toFloat('USD 500.00'); // 500
toFloat('USD 500'); // 500

toFloat('EUR 1.500,00'); // 1500
toFloat('EUR 1.500'); // 1500
toFloat('EUR 500,00'); // 500
toFloat('EUR 500'); // 500
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.