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.

Bobby Borszich
fonte

Respostas:

480

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

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
CMS
fonte
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
23

accounting.js é o caminho a percorrer. Eu usei em um projeto e tive uma experiência muito boa em usá-lo.

accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
accounting.unformat("€ 1.000.000,00", ","); // 1000000

Você pode encontrá-lo no GitHub

Thomas Kremmel
fonte
6
Atualização: essa biblioteca tem 71 problemas em aberto e não foi editada em 5 meses, por isso não confio nela. github.com/openexchangerates/accounting.js/issues
Ryan
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;
Jamie
fonte
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.

Phill
fonte
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.

Vindicar
fonte
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
8

Este exemplo é executado ok

var currency = "$123,456.00";
var number = Number(currency.replace(/[^0-9\.]+/g,""));
alert(number);

http://jsbin.com/ecAviVOV/2/edit

PaVen Nguyen
fonte
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;
}
Isa sem limites
fonte
3

Sei que você encontrou uma solução para sua pergunta, eu só queria recomendar que talvez você veja o seguinte plugin jQuery mais extenso para formatos internacionais de números:

Formatador de números internacionais

IEnumerator
fonte
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$")

bycoder
fonte
3

Você pode tentar isso

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

Ólafur Waage
fonte
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
Rajesh Kumar Maurya
fonte
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);
    }
Jyotiranjan
fonte
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;
}
Santosh Bharadwaj
fonte
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;
} 
Vladislav Kostenko
fonte
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(); ?>).

Skippy le Grand Gourou
fonte
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
melalj
fonte