2010-12-28 40 views
6

Làm cách nào để kiểm tra xem văn bản được nhập trong một hộp văn bản có phải là số nguyên hay không? Tôi đã sử dụng hàm NAN nhưng nó cũng chấp nhận các giá trị thập phân.kiểm tra xem giá trị của một trường text có phải là số nguyên trong javascript

Tôi làm cách nào để thực hiện việc này? Có phương pháp tích hợp nào không?

+0

Chỉ cần lưu ý rằng [* Number.isInteger *] (http: // ecma-interna tional.org/ecma-262/6.0/index.html#sec-isinteger) đã được thêm vào trong ECMA-262 ed 6 aka ECMAScript 2015. – RobG

Trả lời

16

Hãy nói rằng lĩnh vực văn bản được tham chiếu bởi biến intfield, sau đó bạn có thể kiểm tra xem nó như thế này:

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

Điều này sẽ xử lý các chuỗi rỗng hoặc những chuỗi chỉ chứa khoảng trắng, dưới dạng số nguyên hợp lệ. Nếu * intfield.value * là "" (chuỗi rỗng), thì 'Số (" ")' trả về giá trị 0 và 'Math.floor (value) ==' trả về giá trị true. Nó cũng trả về true nếu * value * được để lại dưới dạng một chuỗi rỗng. – RobG

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

Bạn không thể đối sánh cụm từ thông dụng với số. –

+0

Chỉ cần loại bỏ parseInt, nhận ra rằng đã sai. Cảm ơn Brian. – karim79

+0

Số nguyên âm không được xử lý – mplungjan

1

Regular expressions sẽ là một cách:

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

Hoàn dụ với nội dung cập nhật:

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); 
} 

cập nhật để xử lý khoảng trắng - đó có thể là không được phép vào xác nhận nhưng ở đây nó là anyway: có thể tiếp tục sử dụng mã từ liên kết Tôi đưa cho (leftTrim/rightTrim) nhưng ở đây tôi tái sử dụng cắt từ .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

Bạn có một nhóm chụp không cần thiết, không quan trọng quá nhiều khi bạn chỉ sử dụng 'test', nhưng vẫn còn là lẻ. Thêm vào đó nó không tính đến khoảng trắng ở đầu hoặc cuối. –

+0

nói rằng với Gagnon;) Tôi chỉ là người đưa tin ở đây, nhưng điểm được cập nhật theo cách của nó là – mplungjan

+1

Đã cập nhật, tuy nhiên có thể là khoảng trống đầu và cuối được coi là không hợp lệ trong xác thực cho số nguyên chỉ – mplungjan

0

Dữ liệu biểu mẫu luôn là văn bản. Đề nghị của tôi là bạn phân tích nó như số nguyên và so sánh nó với bản gốc:

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(", ")); 

này hiển thị:

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

ký hiệu khoa học không được hỗ trợ, không phải ngàn dải phân cách. Nếu đó là một vấn đề, bạn cần một cái gì đó khác nhau;)

Cập nhật: Tôi muốn nói rõ ràng đây chỉ là một trong những cách tiếp cận có thể, chứ không phải là sự thật duy nhất. Cách tiếp cận này có ý nghĩa nếu bạn cần làm toán với dữ liệu, do đó bạn phải nhận được một biến số.

+0

Tôi gọi quá mức so với đến/^ -? \ d \ d * $/và chức năng của bạn ở đâu? – mplungjan

+0

Tất nhiên, hai dòng là quá mức so với một dòng vì nó chính xác gấp đôi mã. Xấu hổ với tôi. (Bạn có thực sự cần sự giúp đỡ để đóng gói này vào một chức năng?) –

0

Nếu bạn đang tìm kiếm, hoặc cho số nguyên hoặc thập phân bạn có thể đi:

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

tốt nhất để sử dụng các biểu thức chính quy như sau:

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

Chỉ cần một bản demo thử nghiệm:

> 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 
Các vấn đề liên quan