Kiểm tra xem chuỗi chỉ chứa chữ số


324

Tôi muốn kiểm tra nếu a stringchỉ chứa các chữ số. Tôi đã sử dụng điều này:

var isANumber = isNaN(theValue) === false;

if (isANumber){
    ..
}

Nhưng nhận ra rằng nó cũng cho phép +-. Về cơ bản, tôi muốn chắc chắn rằng một inputchữ số CHỈ chứa và không có ký tự nào khác. Vì +100-5là cả hai số, isNaN()không phải là cách đúng đắn để đi. Có lẽ một regrec là những gì tôi cần? Bất cứ lời khuyên?

Câu trả lời:


645

làm thế nào về

let isnum = /^\d+$/.test(val);

1
Điều đó thật tuyệt! Tôi tò mò không tham khảo chữ số có phải là số thập phân không?
dewwwald

5
@dewwwald: Một số ngôn ngữ thực hiện nó một cách khác nhau, nhưng trong JavaScript, \dchính xác tương đương [0-9].
Ry-

Tại đây bạn có thể tìm tài liệu về cách Regular Expressionslàm việc
Danfoa

6
/^\d*$/thay vào đó , nếu bạn tìm thấy một chuỗi rỗng chỉ chứa các chữ số .
Toàn cảnh

@DrorBar Tôi xin lỗi vì tiếng Anh kém của tôi và hãy để tôi viết lại nó: Tôi nếu bạn coi một chuỗi trống chỉ có các chữ số .
Toàn cảnh


16
String.prototype.isNumber = function(){return /^\d+$/.test(this);}
console.log("123123".isNumber()); // outputs true
console.log("+12".isNumber()); // outputs false

2
Nó được coi là thực hành xấu trong Javascript để sửa đổi các nguyên mẫu của các đối tượng tích hợp (nguyên tắc ít gây bất ngờ nhất và xung đột tiềm ẩn trong các phiên bản ECMA trong tương lai) - isNumber = () => /^\d+$/.test(this);thay vào đó hãy xem xét và sử dụng nhưconsole.log(isNumber("123123));
Nick Bull

2
FWIW, vào năm 2009 khi câu trả lời này được đăng, nó vẫn chưa được coi là một thực tiễn xấu. Một số đối thủ cạnh tranh của jQuery tồn tại sau đó, trước khi jQuery chưa chiến thắng, tất cả các phần mở rộng nguyên mẫu đã thực hành.
balupton

14

Nếu bạn muốn thậm chí hỗ trợ các giá trị float (Các giá trị được phân tách bằng dấu chấm) thì bạn có thể sử dụng biểu thức này:

var isNumber = /^\d+\.\d+$/.test(value);

tuy nhiên nếu bạn không sử dụng float thay vì nó sẽ trả về false có thể sử dụng "?" sau khi ". \" giải quyết điều đó. Tôi đề nghị điều này / ^ \
Lucke

@Lucke, regex mà bạn đề xuất sẽ chỉ có thể tìm các số có số thập phân hoặc cao hơn 9. Nếu bạn thay đổi số đầu tiên \d+thành \d*?, nó sẽ có thể khớp 0 - 9, cũng như các số như .333
Gust van de Wal

5
Đóng: var isNumber = /^\d*\.?\d+$/.test(value)- khớp '3.5', '.5', '3' - không khớp '3.'
Peter Hollingsworth

7

Đây là một cách thú vị, dễ đọc khác để kiểm tra xem một chuỗi chỉ chứa các chữ số.

Phương thức này hoạt động bằng cách chia chuỗi thành một mảng bằng toán tử trải , và sau đó sử dụng every()phương thức để kiểm tra xem tất cả các phần tử (ký tự) trong mảng có được bao gồm trong chuỗi các chữ số hay không '0123456789':

const digits_only = string => [...string].every(c => '0123456789'.includes(c));

console.log(digits_only('123')); // true
console.log(digits_only('+123')); // false
console.log(digits_only('-123')); // false
console.log(digits_only('123.')); // false
console.log(digits_only('.123')); // false
console.log(digits_only('123.0')); // false
console.log(digits_only('0.123')); // false
console.log(digits_only('Hello, world!')); // false


1
Điều này cũng sẽ trả về truecho chuỗi rỗng ''và một mảng trống [], một mảng các số nguyên [1, 2, 3](một khi chúng <10). Nó dễ bị lỗi / sử dụng sai hơn so với biểu thức thông thường cơ bản /^\d+$/mà tôi nghĩ
Drenai


5

Đây là một giải pháp mà không sử dụng các biểu thức thông thường:

function onlyDigits(s) {
  for (let i = s.length - 1; i >= 0; i--) {
    const d = s.charCodeAt(i);
    if (d < 48 || d > 57) return false
  }
  return true
}

trong đó 48 và 57 là mã char cho "0" và "9", tương ứng.


5
function isNumeric(x) {
    return parseFloat(x).toString() === x.toString();
}

Mặc dù điều này sẽ trở lại falsetrên chuỗi với các số 0 đứng đầu hoặc dấu.


2

Vâng, bạn có thể sử dụng regex sau:

^\d+$

1

nếu bạn muốn bao gồm các giá trị float, bạn có thể sử dụng đoạn mã sau

theValue=$('#balanceinput').val();
var isnum1 = /^\d*\.?\d+$/.test(theValue);
var isnum2 =  /^\d*\.?\d+$/.test(theValue.split("").reverse().join(""));
alert(isnum1+' '+isnum2);

điều này sẽ kiểm tra chỉ các chữ số và chữ số được phân tách bằng '.' thử nghiệm đầu tiên sẽ bao gồm các giá trị như 0,1 và 0 nhưng cũng có .1, nó sẽ không cho phép 0. vì vậy giải pháp mà tôi đề xuất là đảo ngược giá trị vì vậy .1 sẽ là 1. sau đó biểu thức chính quy sẽ không cho phép.

thí dụ :

 theValue=3.4; //isnum1=true , isnum2=true 
theValue=.4; //isnum1=true , isnum2=false 
theValue=3.; //isnum1=flase , isnum2=true 

-1
c="123".match(/\D/) == null #true
c="a12".match(/\D/) == null #false

Nếu một chuỗi chỉ chứa các chữ số, nó sẽ trả về null

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.