2010-12-28 25 views
6

Jak mogę sprawdzić, czy tekst wprowadzony w polu tekstowym jest liczbą całkowitą czy nie? Użyłem funkcji NAN, ale akceptuję również wartości dziesiętne.sprawdzanie, czy wartość pola tekstowego jest liczbą całkowitą w javascript

Jak mogę to zrobić? Czy jest jakaś wbudowana metoda?

+0

Po prostu zauważam, że [* Number.isInteger *] (http: // ecma-interna tional.org/ecma-262/6.0/index.html#sec-isinteger) został dodany w ECMA-262 ed 6 aka ECMAScript 2015. – RobG

Odpowiedz

16

Powiedzmy, że pole tekstowe jest określany przez zmienną intfield, można sprawdzić to w ten sposób:

var value = Number(intfield.value); 
if (Math.floor(value) == value) { 
    // value is an integer, do something based on that 
} else { 
    // value is not an integer, show some validation error 
} 
+0

Spowoduje to traktowanie pustych ciągów lub zawierających tylko białe znaki, jako poprawnych liczb całkowitych. Jeśli * intfield.value * jest "" (pusty łańcuch), to 'Number (" ")' zwraca 0, a 'Math.floor (value) == value' zwraca true. Zwraca również wartość true, jeśli * wartość * pozostanie pustym ciągiem. – RobG

0
var num = document.getElementById("myField").value; 
if(/^\d+$/.test(num)) { 
    // is an int 
} 
+0

Nie można dopasować wyrażenia regularnego do liczby. –

+0

Właśnie pozbyłem się parsent, zdałem sobie sprawę, że było źle. Dzięki, Brian. – karim79

+0

Negatywne liczby całkowite nie są obsługiwane – mplungjan

1

Wyrażenia regularne byłby sposób:

var re = /^-?\d\d*$/ 
alert(re.test(strNumber)); // leading or trailing spaces are also invalid here 

Kompletny przykład z aktualizacjami:

http://rgagnon.com/jsdetails/js-0063.html

function validateInteger(strValue) { 
/************************************************ 
DESCRIPTION: Validates that a string contains only 
    valid integer number. 

PARAMETERS: 
    strValue - String to be tested for validity 

RETURNS: 
    True if valid, otherwise false. 
**************************************************/ 
    var objRegExp = /(^-?\d\d*$)/; 

    //check for integer characters 
    return objRegExp.test(strValue); 
} 

Updated obsłużyć spacje - co być może nie jest dozwolone w walidacji, ale tutaj jest to w każdym razie: można kontynuować przy użyciu kodu z linku dałem (leftTrim/rightTrim), ale tu ponowne wykończenia z .trim() in JavaScript not working in IE

function ignoreLeadingAndtrailingWhitespace(strValue) { 
    return strValue.length>0?validateInteger(strValue.trim()):false; 
} 

if(typeof String.prototype.trim !== 'function') { 
    String.prototype.trim = function() { 
    return this.replace(/^\s+|\s+$/g, ''); 
    } 
} 


function validateInteger(strValue) { 
/************************************************ 
DESCRIPTION: Validates that a string contains only 
    valid integer number. 

PARAMETERS: 
    strValue - String to be tested for validity 

RETURNS: 
    True if valid, otherwise false. 
**************************************************/ 
    var objRegExp = /(^-?\d\d*$)/; 

    //check for integer characters 
    return objRegExp.test(strValue); 
} 
+0

Masz niepotrzebną grupę przechwytywania, która nie ma znaczenia, ponieważ używasz 'testu', ale wciąż jest dziwna. Plus nie uwzględnia białych znaków na początku ani na końcu. –

+0

Powiedz to Gagnonowi;) Jestem tu tylko posłańcem, ale punkt zaczerpnięty - aktualizuj go w ten sposób – mplungjan

+1

Zaktualizowany, jednak może być tak, że początkowe i końcowe białe znaki należy uznać za nieważne w walidacji dla liczb całkowitych tylko – mplungjan

0

dane Forma jest zawsze tekst. Moja sugestia jest, aby przeanalizować go jako liczbę całkowitą i porównać go z oryginałem:

var sampleData = ["not a number", "0", "10", "3.14", "-12", "-0.34", "2e10", "34foo", "foo34"]; 
var integers = [], notIntegers = []; 
for(var i=0, len=sampleData.length; i<len; i++){ 
    var original = sampleData[i]; 
    var parsed = parseInt(original, 10); 
    if(!isNaN(parsed) && original==parsed){ 
     integers.push(parsed); 
    }else{ 
     notIntegers.push(original); 
    } 
} 
alert("Integers: " + integers.join(", ") + "\nNot integers: " + notIntegers.join(", ")); 

To pokazuje:

Integers: 0, 10, -12 
Not integers: not a number, 3.14, -0.34, 2e10, 34foo, foo34 

notacja naukowa nie jest obsługiwany, ani tysiąc separatorów. Jeśli to jest problem, potrzebujesz czegoś innego;)

Aktualizacja: Chcę wyjaśnić, że jest to tylko jedno z możliwych podejść, a nie jedyna prawda. Takie podejście ma sens, jeśli musisz matematyki z danymi, tak i tak musisz uzyskać zmienną numeryczną.

+0

Wzywam overkill w porównaniu do/^ -? \ d \ d * $/i gdzie jest twoja funkcja? – mplungjan

+0

Oczywiście, dwie linie są przesadzone w porównaniu do jednej linii, ponieważ jest dokładnie dwa razy jako kod. Wstyd mi. (Czy naprawdę potrzebujesz pomocy w enkapsulacji tego w funkcję?) –

0

Jeśli szukasz albo do liczby całkowitej lub dziesiętnej można przejść do:

function IsNumeric(input) 
{ 
    return (input - 0) == input && input.length > 0; 
} 
1
// validate if the input is numeric and between min and max digits 
function validateNumberSize(inputtxt, min, max) 
{ 
    var numbers = /^[0-9]+$/; 
    if(inputtxt.match(numbers)) 
    { 
     if(inputtxt.length >= min && inputtxt.length <= max) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
0

najlepiej użyć wyrażenia regularnego, co następuje:

function isInteger(str) { 
    var r = /^-?[0-9]*[1-9][0-9]*$/; 
    return r.test(str); 
} 

tylko demo Test:

> function isInteger(str) { 
...  var r = /^-?[0-9]*[1-9][0-9]*$/; 
...  return r.test(str); 
... } 
> isInteger("-123") 
true 
> isInteger("a123") 
false 
> isInteger("123.4") 
false 
Powiązane problemy