2009-02-17 12 views
181

Tengo un cuadro de texto que tendrá una cadena de moneda en el que necesito convertir esa cadena a un doble para realizar algunas operaciones en él.¿Cómo convertir una cadena de moneda a una doble con jQuery o Javascript?

"$ 1,100.00" -> 1100.00

Esto tiene que ocurrir todo el lado del cliente. No tengo más remedio que dejar la cadena de moneda como una cadena de moneda como entrada, pero necesito convertirla/convertirla en un doble para permitir algunas operaciones matemáticas.

Respuesta

359

Retire todos los puntos/dígitos: no

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

parece convertir perfectamente para mí, gracias –

+0

+1 (Lamento el comentario anterior, el hecho de que en realidad * excluye * el punto tampoco se me ocurrió por alguna razón.) – Tomalak

+3

Otra razón por la que RegExp puede ser elegante. – OnesimusUnbound

3

Sé que haya encontrado una solución a su pregunta, sólo quería recomendar que tal vez nos fijamos en la siguiente más extenso plugin de jQuery para el Número Internacional formatos:

International Number Formatter

3

Puede probar este

<script type="text/javascript"> 

var str="$1,112.12"; 
str = str.replace(",",""); 
str = str.replace("$",""); 
document.write(parseFloat(str)); 

</script> 
+4

no funcionará, solo se reemplaza la primera coma. – Lee

15

utilizar una expresión regular para eliminar el formateo (dólar y coma), y el uso de parseFloat para convertir la cadena en un punto flotante number.`

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

Merece la pena señalar que no debe usar flotador para aplicaciones que no sean 'Toy' cuando agregue moneda. Terminará con totales ** ** no exactos. – Ally

+6

Se sorprenderá y no estará contento cuando ParseFloat ("151.20" * 100) le da 15119.999999999998 pero parseFloat ("151.40" * 100) le da 15140. No use parseFloat por dinero. Use bibliotecas específicas para manejar dinero, como accounting.js o cualquiera de los otros sugeridos aquí. – bambery

11

Sé que esto es una vieja pregunta, pero quería dar una opción adicional.

jQuery Globalize brinda la capacidad de analizar un formato específico de una cultura en una flotación.

https://github.com/jquery/globalize

Dada una cadena "$ 13,042.00", y globalizar establece en es-:

Globalize.culture("en-US"); 

Usted puede analizar el valor flotante a cabo de esta manera:

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

Esta voluntad darle:

13042.00 

Y le permite trabajar con otras culturas.

+0

ahora esta es una respuesta interesante, ¡gracias! – YangombiUmpakati

3

Sé que esta es una vieja pregunta, pero la respuesta de CMS parece tener un pequeño defecto: solo funciona si el formato de moneda usa "." como separador decimal. Por ejemplo, si necesita trabajar con rublos rusos, la cadena se verá así: "1 000,00 rub."

Mi solución es mucho menos elegante que la de CMS, pero debería ser el truco.

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')); 

Supuestos:

  • valor de la moneda utiliza la notación decimal
  • no hay dígitos en la cadena que no son una parte del valor de la moneda
  • valor de la moneda contiene 0 o 2 dígitos en su parte fraccionaria *

La expresión regular incluso puede manejar algo así como "1,999 dólares y 9 9 centavos ", aunque no es una característica prevista y no se debe confiar en ella.

Espero que esto ayude a alguien.

+0

Gracias. La mejor respuesta. Simple y poderoso. Lo usaría con (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $ para obtener la moneda y - para los centavos. Entonces puedes analizar cadenas como 1,000, - € también. La moneda estará en las partes [1] o en la parte [4] y la parte [3] incluye los centavos como número o -. Entonces puedes normalizar la cadena como quieras. – CyberAleks

+0

Esto es muy malo y peligroso, esto multiplica números menores de 10 por 100. Lo utilicé tontamente antes de probar todos los números con él :( – sheavens

19

accounting.js es el camino a seguir. Lo usé en un proyecto y tuve muy buena experiencia en su uso.

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

Puede encontrarlo en GitHub

+1

Actualización: Esa biblioteca tiene 71 problemas abiertos y no ha sido editada en 5 meses, entonces No estoy confiando en ello. https://github.com/openexchangerates/accounting.js/issues – Ryan

4

En este ejemplo se ejecuta bien

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

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

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

salida es: Rs. 39,00

use jquery.glob.js, 
    jQuery.glob.all.js 
0
$ 150.00 
    Fr. 150.00 
    € 689.00 

He probado para más de tres símbolos de moneda Usted puede hacerlo por otros también.

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

encima expresión regular eliminará todo lo que no es un dígito o un precio period.So Puede obtener la cadena sin símbolo de moneda, pero en el caso de "El P. 150.00" si consola para la salida de lo que recibirá como

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

    output will be like priceFloat : .150.00 

cuál es incorrecto así que usted comprueba el índice de "." luego divide eso y obtén el resultado correcto.

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

Esta es mi función. Funciona con todas las monedas ..

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") o toFloat("1,100.00$")

2

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

// "10.000.500,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; 
} 
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; 
} 
Cuestiones relacionadas