numberformat - ¿Cuál es el símbolo del separador decimal en JavaScript?
number format jquery (3)
Me asaltó una idea cuando escribía un fragmento de código JavaScript que procesaba algunos valores de coma flotante. ¿Cuál es el símbolo del punto decimal en JavaScript? Es siempre ? ¿O es específico de la cultura? ¿Y qué hay de .toFixed()
y .parseFloat()
? Si estoy procesando una entrada del usuario, es probable que incluya el símbolo del separador decimal específico cultural específico.
En última instancia, me gustaría escribir un código que admita ambos puntos decimales en la entrada del usuario: específico de la cultura y .
, pero no puedo escribir ese código si no sé qué espera JavaScript.
Agregado: OK, Rubens Farias suggests mirar una pregunta similar que tiene una respuesta clara y aceptada:
function whatDecimalSeparator() {
var n = 1.1;
n = n.toLocaleString().substring(1, 2);
return n;
}
Eso está bien, me permite obtener el punto decimal local. Un paso hacia la solución, sin dudas.
Ahora, la parte restante sería determinar cuál es el comportamiento de .parseFloat()
. Varias respuestas señalan que solo para literales de punto flotante .
es válida. ¿ .parseFloat()
la misma manera? ¿O podría requerir el separador decimal local en algún navegador? ¿Hay algún método diferente para analizar los números de coma flotante también? ¿Debería lanzar mi propio seguro?
De acuerdo con la especificación, un DecimalLiteral se define como:
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral ExponentPartopt
y para satisfacer el argumento parseFloat:
- Deje que inputString sea ToString (cadena).
- Deje trimmedString ser una subcadena de inputString que consiste en el carácter más a la izquierda que no es un StrWhiteSpaceChar y todos los caracteres a la derecha de ese carácter. (En otras palabras, elimine el espacio en blanco inicial).
- Si ni trimmedString ni ningún prefijo de trimmedString satisface la sintaxis de un StrDecimalLiteral (ver 9.3.1), devuelve NaN.
- Deje que NumberString sea el prefijo más largo de trimmedString, que podría ser trimmedString, que satisface la sintaxis de StrDecimalLiteral.
- Devuelve el valor numérico para el MV
Así que numberString se convierte en el prefijo más largo de trimmedString que satisface la sintaxis de StrDecimalLiteral, es decir, el primer número de cadena literal analizable que encuentra en la entrada. Solo el .
se puede usar para especificar un número de coma flotante. Si acepta entradas de diferentes configuraciones regionales, use una cadena reemplazar:
function parseLocalNum(num) {
return +(num.replace(",", "."));
}
La función usa el operador unario en lugar de parseFloat porque me parece que quieres ser estricto con la entrada. parseFloat("1ABC")
sería 1
, mientras que usar el operador unario +"1ABC"
devuelve NaN
. Esto hace MUCHO más fácil validar la entrada. Usar parseFloat es solo adivinar que la entrada está en el formato correcto.
Por lo que yo sé, JavaScript solo sabe sobre el .
separador para decimales. Al menos una persona cuyo juicio confío en JS está de acuerdo:
utilizar:
theNumber.toLocaleString();
para obtener una cadena correctamente formateada con el separador decimal y miles correcto