2012-02-14 12 views
17

Mam stronę z elementami kontrolowanymi przez użytkownika. Jednym z nich jest pole wprowadzania tekstu, w którym użytkownik ma wprowadzić liczbę. Wszystko działa dobrze, jeśli użytkownik wprowadza tylko cyfry (EG 9000), ale użytkownik używa notacji przecinkowej (9000) javascript nie przyjmuje danych wejściowych jako liczba całkowita.Dzielenie się przecinkami z wprowadzaniem liczb w Javascriptu

Jak usunąć przecinki i/lub wymusić wejście na liczbę całkowitą? Próbowałem użyć parseint(), ale wydaje się, że nie działa z przecinkami.

+2

Należy zauważyć, że w niektórych krajach ludzie użyj przecinków, aby oddzielić dziesiętne i kropki, aby oddzielić tysiące. Warto rozważyć użycie biblioteki obsługującej locale do wykonania analizy liczbowej. – hugomg

+1

Być może. W tej chwili jestem tylko w USA. I powinny być tylko liczby całkowite. – MrGlass

Odpowiedz

34

Użyj globalnego wyrażenie regularne zastąpić pustym ciągiem wszystkie przecinkami:

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

dodaj; na końcu twoich linii i jego faktycznie parseInt (str). W przeciwnym razie działa świetnie, dzięki. – MrGlass

+0

Średniki są rzeczywiście opcjonalne i podążałem za twoim przykładem parseint()! Zgadzam się z dwoma punktami i edytuję :-) – adelphus

+1

Jedyną rzeczą, o którą się tu troszczymy, jest różnica miejscowa w zapisie dziesiętnym; przecinek vs. okres, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString – kalisjoshua

-1

może

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

porozmawiajmy o ograniczenie:

można/należy pozwolić użytkownikowi na wprowadzenie zarówno 9000 & 9.000

można sprawdzić validy poprzez regex.

po stronie serwera - powinieneś wykluczyć przecinki i traktować je jako liczbę całkowitą.

+0

replace() zastąpi tylko * pierwszy * przecinek. Jeśli liczba jest wystarczająco duża, aby mieć więcej niż jeden przecinek, to nie zadziała. – adelphus

+0

@adelphus dzięki edytowane. –

0

lub nawet lepiej, ze względu na ogólny brak wiarygodności danych wprowadzonych przez użytkownika, użyj tego, aby pozbyć się wszystkich znaków nienumerycznych :

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

+0

To powinna być odpowiedź :) –

+1

To jest złe. Jeśli użyjesz tego wyrażenia regularnego, zastąpi ono ułamki dziesiętne, które zmieniłyby liczbę - na przykład: parseInt ("1 200.34". Miejsce (/ [^ 0-9]/g, "')); zwróci: 120034 –

+0

Program OP zapytał "w jaki sposób usunąć przecinki i/lub wymusić wejście na liczbę całkowitą", więc nie jest źle. – blankabout

3

lub nawet lepiej

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

Nie zgadzam się, że w ogóle jest to "lepsze". To zalecenie, jak również @ blankabout, zmienia dane wejściowe od użytkownika, a gdy to zrobisz, musisz również zapytać użytkownika, czy twoja interpretacja jego danych wejściowych jest tym, co faktycznie zamierzała. Podczas gdy przecinki są dopuszczalne i oczekiwane odchylenie, dodanie innych znaków nie jest. – kalisjoshua

+0

Dzięki za opinie, ale przecinki to nie tylko dopuszczalne znaki, ludzie mają tendencję do wprowadzania $, # itp. W przypadku walut, a także ludzie mają tendencję do dodawania spacji. Typowe nieporozumienia to ceny zawierające tylko cyfry i znaki interpunkcyjne. (Niemcy mogą napisać 12, - €). Kolejnym nieporozumieniem jest oddzielenie dużych cen przez grupowanie liczb w trojaczkach (tysiącach). (Ktoś pisze ¥ 1 0000). pKiedy piszesz kod, proszę go udostępnić dla każdego użytkownika. –

+0

Myślę, że się zgadzamy, ale powyższe wyrażenie jest zbyt uproszczone; powinno szukać konkretnych wzorów, a nie tylko strumienia danych, który zawiera liczby, które można interpretować jako liczbę. Na przykład "3 zestawy po 4" nie powinny być interpretowane jako "34" ani "3 - 4". To jest mój punkt widzenia, ale być może nie jest dobrze sformułowany wcześniej, a być może również może rozciągać temat pierwotnego pytania. – kalisjoshua

Powiązane problemy