JavaScript의 문자열이 양의 정수인지 확인하는 가장 간단한 오류 방지 테스트를 원합니다.
isNaN(str)
정수가 아닌 모든 종류의 값에 대해 true를 반환하고 parseInt(str)
“2.5”와 같이 부동 문자열에 대한 정수를 반환합니다. 그리고 jQuery 플러그인도 사용하고 싶지 않습니다.
답변
두 가지 답변 :
-
파싱 기반
-
정규식
두 경우 모두, 내가 포함 “양의 정수”를 해석 한 것을 참고 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이나 공백이없는 경우) :
(라이브 테스트 베드 와 앞의 0과 공백에 대한 처리) :
허용하지 않으려면로 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);
}
라이브 테스트 베드 :
작동 방식 :
-
^
: 문자열의 일치 시작 -
\+?
: 단일 옵션을 허용합니다+
(원치 않는 경우 제거) -
(?:...|...)
: 캡처 그룹을 작성하지 않고 다음 두 옵션 중 하나를 허용하십시오.-
(0|...)
:0
스스로 허용 … -
(...|[1-9]\d*)
: … 또는0
10 진수 이외의 숫자로 시작하는 숫자.
-
-
$
: 문자열 끝과 일치합니다.
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
문자열 끝에 가비지를 무시하지만 정규 표현식에 아무것도 없는지 확인했습니다.
답변
해결책 1
우리가 경우 고려 최대의 값으로 자바 스크립트 정수 4294967295
(예 Math.pow(2,32)-1
), 다음 짧은 솔루션은 완벽하게 작업을 것입니다 :
function isPositiveInteger(n) {
return n >>> 0 === parseFloat(n);
}
기술:
- 제로 채우기 오른쪽 시프트 연산자 는 세 가지 중요한 작업을 수행합니다.
- 소수점 이하 자르기
123.45 >>> 0 === 123
- 음수 이동
-1 >>> 0 === 4294967295
- 의 범위에서 “작동”
MAX_INT
1e10 >>> 0 === 1410065408
1e7 >>> 0 === 10000000
- 소수점 이하 자르기
parseFloat
문자열 번호를 올바르게 구문 분석합니다 (NaN
숫자가 아닌 문자열에 대한 설정 ).
테스트 :
"0" : true
"23" : true
"-10" : false
"10.30" : false
"-40.1" : false
"string" : false
"1234567890" : true
"129000098131766699.1" : false
"-1e7" : false
"1e7" : true
"1e10" : false
"1edf" : false
" " : false
"" : false
데모 : http://jsfiddle.net/5UCy4/37/
해결책 2
또 다른 방법은 Number.MAX_VALUE
, 최대 약 유효한 모든 숫자 값에 적합합니다 1.7976931348623157e+308
.
function isPositiveInteger(n) {
return 0 === n % (!isNaN(parseFloat(n)) && 0 <= ~~n);
}
기술:
!isNaN(parseFloat(n))
필터링하는 데 사용되는 순수 문자열 값을, 예를 들어""
," "
,"string"
,0 <= ~~n
네거티브 크고 정수가 아닌 값을, 예를 들면 필터"-40.1"
,"129000098131766699"
;(!isNaN(parseFloat(n)) && 0 <= ~~n)
true
값이 숫자 이고 양수인 경우를 반환 합니다 .0 === n % (...)
값이 아닌 경우 플로트 체크 – 여기에서(...)
(3 참조)와 같은 평가0
의 경우false
와 같은1
경우true
.
테스트 :
"0" : true
"23" : true
"-10" : false
"10.30" : false
"-40.1" : false
"string" : false
"1234567890" : true
"129000098131766699.1" : false
"-1e10" : false
"1e10" : true
"1edf" : false
" " : false
"" : false
데모 : http://jsfiddle.net/5UCy4/14/
이전 버전 :
function isPositiveInteger(n) {
return n == "0" || ((n | 0) > 0 && n % 1 == 0);
}
답변
정규 표현식이가는 방법 인 것 같습니다.
var isInt = /^\+?\d+$/.test('the string');
답변
노드 및 모든 브라우저 (IE 및 Opera Mini 제외) 의 90 % 이상 에서 작동하는 최신 솔루션은 Number.isInteger 를 사용 하고 간단한 긍정적 인 확인을 수행하는 것입니다.
Number.isInteger(x) && x > 0
이것은 ECMAScript 2015에서 마무리되었습니다 .
function isPositiveInteger(x) {
return Number.isInteger(x) && x > 0
}
Polyfil은 다음과 같습니다.
Number.isInteger = Number.isInteger || function(value) {
return typeof value === 'number' &&
isFinite(value) &&
Math.floor(value) === value;
};
문자열 로 된 입력을 지원해야하는 경우 또는 숫자 형식의 경우이 기능을 사용할 수 있습니다.이 기능은 모든 기존 답변 (2018 년 2 월 1 일)이 특정 형식의 입력에서 실패한 후 대규모 테스트 스위트를 작성했습니다.
function isPositiveInteger(v) {
var i;
return v && (i = parseInt(v)) && i > 0 && (i === v || ''+i === v);
}
답변
이것은 이것에 대한 거의 중복 질문입니다.
JavaScript에서 10 진수 유효성 검사-IsNumeric ()
대답은 다음과 같습니다.
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
따라서 양의 정수는 다음과 같습니다.
function isPositiveInteger(n) {
var floatN = parseFloat(n);
return !isNaN(floatN) && isFinite(n) && floatN > 0
&& floatN % 1 == 0;
}
답변
return ((parseInt(str, 10).toString() == str) && str.indexOf('-') === -1);
‘0001’과 같은 문자열을 제공하면 작동하지 않습니다.
답변
내 함수는 숫자가 + ve인지 확인하고 십진수 값을 가질 수도 있습니다.
function validateNumeric(numValue){
var value = parseFloat(numValue);
if (!numValue.toString().match(/^[-]?\d*\.?\d*$/))
return false;
else if (numValue < 0) {
return false;
}
return true;
}