2010-01-18 23 views
41

Me asaltó una idea cuando escribía un código JavaScript que procesaba algunos valores de coma flotante. ¿Cuál es el símbolo del punto decimal en JavaScript? ¿Siempre es .? ¿O es específico de la cultura? ¿Y qué pasa con .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.¿Cuál es el símbolo de separador decimal en JavaScript?

En última instancia, me gustaría escribir un código que admita dos decimales en la entrada del usuario - cultural específico y ., pero no puedo escribir ese código si no sé qué espera JavaScript.

Agregado: OK, Rubens Farías suggests para mirar similar question que tiene una ordenada respuesta aceptada:

function whatDecimalSeparator() { 
    var n = 1.1; 
    n = n.toLocaleString().substring(1, 2); 
    return n; 
} 

Eso es bueno, que le permite a conseguir 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 para literales de punto flotante solo . es válido. ¿Funciona el .parseFloat() de 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?

+0

@ Vilx- por lo que estás haciendo, consideraría usar el operador unario (+) en lugar de 'parseFloat()'. Será mucho más fácil al validar la entrada. Ver mi respuesta actualizada. –

Respuesta

19

Según la especificación, un DecimalLiteral se define como:

DecimalLiteral :: 
    DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt 
    . DecimalDigits ExponentPartopt 
    DecimalIntegerLiteral ExponentPartopt 

y para satisfacer el argumento parseFloat:

  1. Let inputString ser ToString (cadena).
  2. Let 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, Quitar el espacio.)
  3. Si ninguno trimmedString ni ningún prefijo de trimmedString satisface la sintaxis de un StrDecimalLiteral (ver 9.3.1), devuelve NaN.
  4. Deje que numberString sea el prefijo más largo de trimmedString, que podría ser trimmedString, que satisface la sintaxis de un StrDecimalLiteral.
  5. Devuelve el valor del número por el MV

Así numberString se convierte en el prefijo más largo de trimmedString que satisface la sintaxis de un StrDecimalLiteral, es decir, el primer número literal de cadena analizable que encuentra en la entrada. Solo el . se puede usar para especificar un número de coma flotante.Si lo acepta entradas desde diferentes lugares, utilice una cadena reemplazar:

function parseLocalNum(num) { 
    return +(num.replace(",", ".")); 
} 

La función utiliza el operador unitario en lugar de parseFloat porque me parece que usted quiere ser estricto en cuanto a la entrada. parseFloat("1ABC") sería 1, mientras que el uso del 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.

+0

Eso es para literales. ¿Se requiere '.parseFloat()' para hacer lo mismo? –

+3

Sí. 'parseFloat (" 1,01 ")' en cualquier configuración regional devolverá '1', no' 1.01' –

+4

Mozilla Developer Center dice: "parseFloat analiza su argumento, una cadena, y devuelve un número de punto flotante. Si encuentra un carácter además de un signo (+ o -), un número (0-9), un punto decimal o un exponente, devuelve el valor hasta ese punto e ignora ese carácter y todos los caracteres siguientes. Se permiten los espacios iniciales y finales ". https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/parseFloat –

2

Por lo que sé, JavaScript solo conoce el separador . para decimales. Al menos una persona cuyo juicio confío en JS lo que está de acuerdo:

http://www.merlyn.demon.co.uk/js-maths.htm#DTS

+2

Para agregar a esto, consulte la antigua especificación ECMAScript 262 sobre la gramática wrt analizar los literales numéricos: http://bclary.com/2004/11/07/#a-7.8.3 – Anonymous

+0

Ah sí, siempre es bueno tener documentación oficial para este tipo de cosas, gracias :) –

+0

Sí, eso es para literales. ¿Qué hay de analizar la entrada de cadena? –

9

uso:

theNumber.toLocaleString(); 

para obtener una cadena con formato correcto con el decimal a la derecha y separadores de miles

+0

OK. ¿Y cómo puedo analizar una cadena con estos separadores? –

+0

deberías quitar los seps, y asegurarte de que se ajuste a algo como: [\ + \ -]? ([0-9] + | [0-9] * (\. ([EE] [\ + \ -]? [0-9] +))?) – jspcal

+0

Lo suficiente, puedo quitar lo que sea necesario y puedo reemplazar el separador específico de locale por '.'. ¿Pero es '.' lo único que' .parseFloat() 'espera? –

Cuestiones relacionadas