Lo tengo 2,299.00
como una cadena y estoy tratando de analizarlo en un número. Intenté usar parseFloat
, lo que da como resultado 2. Supongo que la coma es el problema, pero ¿cómo podría resolver este problema de la manera correcta? ¿Solo quita la coma?
var x = parseFloat("2,299.00")
alert(x);
javascript
number-formatting
usuario1540714
fuente
fuente
.replace(/,/g, '')
Esta expresión regular usa el globalg
para reemplazar-todo.parseFloat("2,000,000.00".replace(',',''))
devoluciones2000
y 2. falla en muchas regiones del mundo donde,
hay un lugar decimal, por ejemplo,parseFloat("2.000.000,00".replace(',',''))
devoluciones2
- vea mi respuesta a continuación para algo que funciona en todas partes del mundo.Eliminar las comas es potencialmente peligroso porque, como otros han mencionado en los comentarios, muchas configuraciones regionales usan una coma para significar algo diferente (como un lugar decimal).
No sé de dónde sacaste tu cuerda, pero en algunos lugares del mundo
"2,299.00"
=2.299
El
Intl
objeto podría haber sido una buena manera de abordar este problema, pero de alguna manera lograron enviar la especificación con solo unaIntl.NumberFormat.format()
API y sinparse
contraparte :(La única forma de analizar una cadena con caracteres numéricos culturales en un número reconocible por la máquina de cualquier manera sana es usar una biblioteca que aproveche los datos CLDR para cubrir todas las formas posibles de formatear cadenas numéricas http: //cldr.unicode. org /
Las dos mejores opciones de JS que he encontrado para esto hasta ahora:
fuente
En los navegadores modernos, puede utilizar el Intl.NumberFormat integrado para detectar el formato de número del navegador y normalizar la entrada para que coincida.
Obviamente, hay espacio para algunas optimizaciones y almacenamiento en caché, pero esto funciona de manera confiable en todos los idiomas.
fuente
Quite todo lo que no sea un dígito, punto decimal o signo menos (
-
):Violín actualizado
Tenga en cuenta que no funcionará para números en notación científica. Si usted quiere que, cambiar la
replace
línea para añadire
,E
y+
la lista de caracteres aceptables:fuente
str = str.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");
Esto es lo que usaría, pero soy completamente inútil en regex y es algo que encontré hace un tiempo en algún otro hilo SO.parseFloat
, lo que lo validará. :-)Por lo general, debe considerar el uso de campos de entrada que no permitan la entrada de texto libre para valores numéricos. Pero puede haber casos en los que necesite adivinar el formato de entrada. Por ejemplo, 1.234,56 en Alemania significa 1.234,56 en EE. UU. Consulte https://salesforce.stackexchange.com/a/21404 para obtener una lista de países que utilizan coma como decimal.
Utilizo la siguiente función para hacer una mejor estimación y eliminar todos los caracteres no numéricos:
Pruébelo aquí: https://plnkr.co/edit/9p5Y6H?p=preview
Ejemplos:
La función tiene un punto débil: no es posible adivinar el formato si tiene 1.123 o 1.123, porque dependiendo del formato de la configuración regional, ambos pueden ser una coma o un separador de miles. En este caso especial, la función tratará el separador como un separador de miles y devolverá 1123.
fuente
3,00 €
también se reemplaza a 3.00. Solo una nota, que3,001
tiene el formato3001
. Para evitar esto, la entrada debe ser siempre con símbolos decimales. Por ejemplo,3,001.00€
3,001.00
convierte correctamente. Además, actualice jsfiddle.0,124
todavía se convierte en 124Es desconcertante que hayan incluido un método toLocaleString pero no un método de análisis . Al menos toLocaleString sin argumentos está bien soportado en IE6 +.
Para una solución i18n , se me ocurrió esto:
Primero detecte el separador decimal de la configuración regional del usuario:
Luego, normalice el número si hay más de un separador decimal en la Cadena:
Finalmente, elimine todo lo que no sea un número o un separador decimal:
fuente
Esta es una envoltura simplista y discreta alrededor de la
parseFloat
función.fuente
Si desea evitar el problema que publicó David Meister y está seguro del número de decimales, puede reemplazar todos los puntos y comas y dividir por 100, ej .:
o si tienes 3 decimales
Depende de usted si desea utilizar parseInt, parseFloat o Number. Además, si desea mantener el número de lugares decimales, puede usar la función .toFixed (...).
fuente
Todas estas respuestas fallan si tiene un número de millones.
3.456.789 simplemente devolvería 3456 con el método de reemplazo.
La respuesta más correcta para simplemente eliminar las comas tendría que ser.
O simplemente escrito.
fuente
Esto convierte un número en cualquier lugar en un número normal. También funciona para puntos decimales:
fuente
Con esta función podrás formatear valores en múltiples formatos como
1.234,56
y1,234.56
, e incluso con errores como1.234.56
y1,234,56
fuente
Si quieres una respuesta l10n, hazlo de esta manera. El ejemplo usa moneda, pero no la necesita. La biblioteca de Intl deberá estar rellenada con polimerización si tiene que admitir navegadores más antiguos.
fuente
replace()
solo reemplaza la primera coincidencia cuando no se usaRegExp
con'g'
flag.,
está en el separador de comas en algunos lugaresReemplaza la coma con una cadena vacía:
fuente
Si tiene un pequeño conjunto de configuraciones regionales para admitir, probablemente estaría mejor codificando un par de reglas simples:
fuente
fuente
La función split divide la cadena en una matriz usando "," como separador y devuelve una matriz.
La función de unión une los elementos de la matriz devueltos por la función de división.
La función Number () convierte la cadena unida en un número.
fuente