2012-02-14 7 views
17

Tengo una página con algunos elementos que están controlados por el usuario. Uno de estos es un campo de entrada de texto, donde el usuario debe ingresar un número. Todo funciona bien si el usuario solo ingresa dígitos (EG 9000), pero si el usuario usa la notación de coma (el ser 9,000) javascript no toma la entrada como un entero.Comas jugando con la entrada de número en Javascript

¿Cómo puedo eliminar las comas y/o forzar la entrada a un número entero? Intenté usar parseint(), pero no parece funcionar con comas.

+2

Tenga en cuenta que en algunos países las personas Usa comas para separar los decimales y puntos para separar los miles. Es posible que desee considerar el uso de una biblioteca sensible a la configuración regional para realizar el análisis sintáctico del número por usted. – hugomg

+1

Quizás. En este momento, solo estoy en los Estados Unidos. Y debería haber solo enteros. – MrGlass

Respuesta

34

utilizar una expresión regular global para reemplazar todos comas con una cadena vacía:

var str = "12,345,678"; 
str = str.replace(/,/g, ""); 
parseInt(str, 10); 
+0

agregar; hasta el final de sus líneas, y es realmente parseInt (str). De lo contrario, funciona genial, gracias. – MrGlass

+0

Los puntos y comas son en realidad opcionales y yo estaba siguiendo tu ejemplo de parseint()! Sin embargo, concedo a ambos sus puntos y editaré :-) – adelphus

+1

Lo único que hay que tener en cuenta aquí es para las diferencias de localidad de la notación decimal; coma vs. punto, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString – kalisjoshua

-1

quizá

parseint(ny9000withCommas.replace(/\,/g,"")) 

permite hablar de la restricción:

puede/debe permitir al usuario introducir tanto 9000 & 9.000

se puede comprobar a través de REGEX Validy.

en el lado del servidor - debe eliminar las comas y tratarlas como un número entero.

+0

replace() solo reemplazará la * primera * coma. Si el número es lo suficientemente grande como para tener más de una coma, esto no funcionará. – adelphus

+0

@adelphus gracias editado. –

0

O mejor aún, dada la falta de fiabilidad general de entrada del usuario, utilizar esto para deshacerse de todos los caracteres no numéricos :

 
var s = "9,Ljk876"; 
var t = parseInt(s.replace(/[^0-9]/g, '')); 
alert ("s:" + s + ", t:" + t); 

+0

Esta debería ser la respuesta :) –

+1

Esto es incorrecto. Si usa esa expresión regular, reemplazará los decimales que cambiarían el número, por ejemplo: parseInt ('1,200.34'.replace (/ [^ 0-9]/g,' ')); volvería: 120034 –

+0

El OP preguntó '¿cómo puedo eliminar las comas y/o forzar la entrada a un número entero', por lo que no está mal. – blankabout

3

o incluso mejor

var s="jdjsghd0182.99"; 
var str = parseFloat(s.replace(/[^0-9 | ^.]/g, '')); 
+1

No estoy de acuerdo en que esto sea "mejor". Esta recomendación, al igual que la de @ blankabout, está cambiando la entrada de un usuario y, una vez que lo haga, también debería preguntarle al usuario si su interpretación de su entrada es lo que realmente pretendía. Mientras que las comas son una desviación aceptable y esperada, la suma de otros caracteres no lo es. – kalisjoshua

+0

Gracias por sus comentarios, pero las comas no son solo caracteres aceptables, las personas tienden a poner $, # etc. para las monedas y también las personas tienden a agregar espacios. conceptos erróneos comunes es que los precios solo contienen dígitos y signos de puntuación. (Los alemanes pueden escribir 12, - €). otra idea errónea es que separa los precios grandes agrupando los números en tripletas (miles). (Uno escribe ¥ 1 0000). pCuando escribe código, hágalo accesible para cada tipo de usuario –

+0

Creo que estamos de acuerdo, pero la expresión anterior es demasiado simplista; debería buscar patrones específicos, no solo cualquier flujo de entrada que contenga números que podrían interpretarse como un número. Por ejemplo, "3 series de 4" no deben interpretarse como "34" ni deben ser "3 - 4". Ese es mi punto, pero posiblemente no esté bien redactado antes, y posiblemente también pueda estar extendiendo el tema de la pregunta original. – kalisjoshua

Cuestiones relacionadas