두 가지 답변 :
두 경우 모두, 내가 포함 "양의 정수"를 해석 한 것을 참고 0비록은 0긍정적 없습니다. 당신이 허용하지 않으려면 메모를 포함합니다 0.
파싱 기반
합리적인 범위의 값에서 정규화 된 십진 정수 문자열이되도록하려면 다음을 수행하십시오.
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
또는 공백과 선행 0을 허용하려는 경우 :
function isNormalInteger(str) {
str = str.trim();
if (!str) {
return false;
}
str = str.replace(/^0+/, "") || "0";
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
라이브 테스트 베드 (앞에 0이나 공백이없는 경우) :
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", false); // false because we don't handle leading 0s
test(" 123 ", false); // false because we don't handle whitespace
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
(라이브 테스트 베드 와 앞의 0과 공백에 대한 처리) :
function isNormalInteger(str) {
str = str.trim();
if (!str) {
return false;
}
str = str.replace(/^0+/, "") || "0";
var n = Math.floor(Number(str));
return String(n) === str && n >= 0;
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", true);
test(" 123 ", true);
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
허용하지 않으려면로 0변경 >= 0하십시오 > 0. (또는 선행 0을 허용하는 버전 || "0"에서는 replace라인을 제거하십시오 .)
작동 방식 :
공백과 선행 0을 허용하는 버전에서 :
str = str.trim(); 앞뒤 공백을 제거합니다.
if (!str) 빈 문자열을 잡아서 나머지 작업을 수행 할 때 아무런 의미가 없습니다.
str = str.replace(/^0+/, "") || "0"; 문자열에서 모든 선행 0을 제거합니다. 그러나 빈 문자열이되면 단일 0을 복원합니다.
Number(str): str숫자로 변환 ; 그 수는 소수 부분을 가질 수 있거나 또는 일 수있다 NaN.
Math.floor: 숫자를 자릅니다 (소수 부분 잘라 냄).
String(...): 결과를 다시 정상 10 진수 문자열로 변환합니다. 실제로 큰 숫자의 경우 과학 표기법으로 이동 하여이 접근법을 깨뜨릴 수 있습니다. (스 플리트가 어디에 있는지, 세부 사항이 spec에 있는지 잘 모르겠지만 , 전체 숫자의 경우 IEEE-754와 같이 21 자리를 초과 한 시점에 있다고 생각합니다. 배정도 숫자는 대략 15 자리의 정밀도 만 갖습니다.)
... === str: 원래 문자열과 비교합니다.
n >= 0: 긍정적인지 확인하십시오.
이것은 "+1"입력에서, 과학적 표기법의 입력에서 String(...)스테이지 에서 동일한 과학적 표기법으로 다시 돌아 가지 않으며 JavaScript가 사용하는 숫자 종류 (IEEE-754 배정도 이진 부동 소수점)에 대해서는 실패합니다. 주어진 구문과 다른 값에 더 가까운 구문을 정확하게 나타낼 수 없습니다 (예를 들어, 9,007,199,254,740,992 이상의 많은 정수 포함; 1234567890123456789실패). 전자는 쉬운 해결책이며, 후자는 그다지 많지 않습니다.
정규식
다른 접근 방식은 정규 표현식을 통해 문자열의 문자를 테스트하는 것입니다. 목표는 옵션 +다음 0에 일반 10 진수 형식의 문자열을 허용하는 것입니다 (예 :).
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
라이브 테스트 베드 :
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", false); // false because we don't handle leading 0s
test(" 123 ", false); // false because we don't handle whitespace
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
작동 방식 :
^: 문자열의 일치 시작
\+?: 단일 옵션을 허용합니다 +(원치 않는 경우 제거)
(?:...|...): 캡처 그룹을 작성하지 않고 다음 두 옵션 중 하나를 허용하십시오.
(0|...): 0스스로 허용 ...
(...|[1-9]\d*): ... 또는 010 진수 이외의 숫자로 시작하는 숫자.
$: 문자열 끝과 일치합니다.
0긍정적이지 않기 때문에 허용하지 않으려면 정규 표현식이 그대로됩니다 /^\+?[1-9]\d*$/(예 : 허용해야하는 대체 항목을 잃을 수 있음 0).
당신이 선행 0 (0123, 00524)을 허용 할 경우, 바로 교대 교체 (?:0|[1-9]\d*)로를\d+
function isNormalInteger(str) {
return /^\+?\d+$/.test(str);
}
공백을 허용하려면 \s*직후 ^와 \s*바로 앞에 추가하십시오 $.
당신이 수 있음을 변환 할 때 참고 : 현대 엔진에 아마 사용하기에 괜찮을 것 +str또는 Number(str)그것을 할 수 있지만, 오래된 것들 앞에 0 수단을 말한다 비표준 (하지만 이전-허용) 방식으로 사람들을 확장 할 수있는 8 진수 (base 8), 예를 들어 "010"=> 8. 숫자의 유효성을 검사 한 후에는 parseInt(str, 10)10 진수 (base 10)로 구문 분석되도록 안전하게 사용할 수 있습니다 . parseInt문자열 끝에 가비지를 무시하지만 정규 표현식에 아무것도 없는지 확인했습니다.