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

Eu tenho uma checkbox de texto que terá uma seqüência de moeda em que eu preciso converter essa seqüência para um duplo para executar algumas operações nele.

“US $ 1.100,00” -> 1100,00

Isso precisa ocorrer todo o lado do cliente. Eu não tenho escolha a não ser deixar a string de moeda como uma string de moeda como input, mas preciso convertê-la em double para permitir algumas operações matemáticas.

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

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

O accounting.js é o caminho a percorrer. Eu usei isso 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

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

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

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

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

https://github.com/jquery/globalize

Dada uma string “$ 13,042.00” e Globalize definida como en-US:

 Globalize.culture("en-US"); 

Você pode analisar o valor flutuante assim:

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

Isso lhe dará:

 13042.00 

E permite que você trabalhe com outras culturas.

Este exemplo correu ok

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

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

Você pode tentar isso

  

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

Formatador Internacional de Números

Eu sei que esta é uma pergunta antiga, mas a resposta do CMS parece ter uma pequena falha: ela só funciona se o formato de moeda usar “.” como separador decimal. Por exemplo, se você precisa trabalhar com rublos russos, a string ficará assim: “1 000,00 esfregar”.

Minha solução é bem 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{2}))?\D*$/; var parts = cur_re.exec(currency); var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00')); 

Premissas:

  • 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 confiável.

Espero que isso ajude alguém.

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

a saída é: Rs. 39,00

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

// “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; } 

Esta é minha function. 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") ou toFloat("1,100.00$")

 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; } 
 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; } 
  $ 150.00 Fr. 150.00 € 689.00 

Eu testei acima de três símbolos de moeda. Você pode fazer isso para os outros também.

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

Acima da expressão regular irá remover tudo o que não é um dígito ou um período.Então você pode obter a seqüência de caracteres sem símbolo de moeda, mas no caso de “Fr. 150,00” se você consola para a saída, então você vai ter preço como

  console.log('priceFloat : '+priceFloat); output will be like priceFloat : .150.00 

o que está errado, então você verifica o índice de “.” então divida isso e obtenha o resultado adequado.

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