[javascript] 문자열이 유효한 숫자인지 확인하기 위해 JavaScript에서 (내장) 방식
이전 VB6 IsNumeric()
기능 과 동일한 개념 공간에 무언가가 있기를 바라고 있습니까?
답변
변수 (문자열 포함)가 숫자인지 확인하려면 숫자가 아닌지 확인하십시오.
변수 내용이 문자열인지 숫자인지에 관계없이 작동합니다.
isNaN(num) // returns true if the variable does NOT contain a valid number
예
isNaN(123) // false
isNaN('123') // false
isNaN('1e10000') // false (This translates to Infinity, which is a number)
isNaN('foo') // true
isNaN('10px') // true
물론 필요한 경우이를 무효화 할 수 있습니다. 예를 들어, IsNumeric
당신이 준 예제 를 구현하려면 :
function isNumeric(num){
return !isNaN(num)
}
숫자가 포함 된 문자열을 숫자로 변환하려면
문자열 에 숫자 만 포함 된 경우에만 작동 하고 그렇지 않으면를 반환합니다 NaN
.
+num // returns the numeric value of the string, or NaN
// if the string isn't purely numeric characters
예
+'12' // 12
+'12.' // 12
+'12..' // NaN
+'.12' // 0.12
+'..12' // NaN
+'foo' // NaN
+'12px' // NaN
문자열을 느슨하게 숫자로 변환하려면
예를 들어 ’12px’를 12로 변환하는 데 유용합니다.
parseInt(num) // extracts a numeric value from the
// start of the string, or NaN.
예
parseInt('12') // 12
parseInt('aaa') // NaN
parseInt('12px') // 12
parseInt('foo2') // NaN These last two may be different
parseInt('12a5') // 12 from what you expected to see.
수레
곰 염두에두고 있다고는 달리 +num
, parseInt
(이름에서 알 수 있듯이) 소수점을 다음 모든 잘라낸에 의해 정수에 float를 변환합니다 (사용하려는 경우 parseInt()
때문에 이 문제가, 당신은 아마 더 나은 대신 다른 방법을 사용하여 길 이죠 ) :
+'12.345' // 12.345
parseInt(12.345) // 12
parseInt('12.345') // 12
빈 문자열
빈 문자열은 약간 반 직관적 일 수 있습니다. +num
빈 문자열 또는 공백이있는 문자열을 0으로 변환 isNaN()
하고 동일하다고 가정합니다.
+'' // 0
+' ' // 0
isNaN('') // false
isNaN(' ') // false
그러나 parseInt()
동의하지 않습니다 :
parseInt('') // NaN
parseInt(' ') // NaN
답변
그리고 당신은 RegExp-way를 갈 수 있습니다 :
var num = "987238";
if(num.match(/^-{0,1}\d+$/)){
//valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
//valid float
}else{
//not valid number
}
답변
문자열이 정수인지 (소수점이 아닌) 확인하려고한다면 정규 표현식을 사용하는 것이 좋습니다. 다른 방법 isNaN
은 너무 복잡해서 너무 복잡합니다.
function isNumeric(value) {
return /^-{0,1}\d+$/.test(value);
}
console.log(isNumeric('abcd')); // false
console.log(isNumeric('123a')); // false
console.log(isNumeric('1')); // true
console.log(isNumeric('1234567890')); // true
console.log(isNumeric('-23')); // true
console.log(isNumeric(1234)); // true
console.log(isNumeric('123.4')); // false
console.log(isNumeric('')); // false
console.log(isNumeric(undefined)); // false
console.log(isNumeric(null)); // false
양의 정수만 허용하려면 다음을 사용하십시오.
function isNumeric(value) {
return /^\d+$/.test(value);
}
console.log(isNumeric('123')); // true
console.log(isNumeric('-23')); // false
답변
당신이 정말로 문자열은 숫자, 숫자 (정수 또는 부동 소수점), 정확히 숫자가 포함되어 있는지 확인하려면, 당신은 할 수 사용 parseInt()
/ parseFloat()
, Number()
또는 !isNaN()
스스로. 참고 !isNaN()
실제로 반환 true
할 때 Number()
숫자를 반환하고, false
그것을 반환 할 때 NaN
, 그래서 토론의 나머지 부분에서 제외됩니다.
문제는 parseFloat()
문자열이 숫자가 포함 된 경우 문자열이 포함되지 않은 경우에도이 숫자를 반환 할 것입니다 단지 와 정확히 번호 :
parseFloat("2016-12-31") // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2
문제 Number()
는 전달 된 값이 숫자가 아닌 경우 숫자를 반환한다는 것입니다!
Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0 \t\n\r") // returns 0
자신의 정규 표현식을 롤링 할 때의 문제점은 Javascript가 인식 할 때 부동 소수점 숫자와 일치하는 정확한 정규 표현식을 만들지 않으면 대소 문자를 놓치거나 피해야 할 경우를 인식한다는 것입니다. 그리고 자신의 정규식을 굴릴 수 있다고해도 왜? 더 간단한 내장 방법이 있습니다.
그러나 Number()
(및 isNaN()
)는하지 parseFloat()
않아야 할 때 숫자를 반환하는 모든 경우에 대해 올바른 작업을 수행 하고 그 반대의 경우도 마찬가지입니다. 따라서 문자열이 실제로 정확하고 유일한 숫자인지 확인하려면 두 함수를 모두 호출하고 둘 다 true를 반환 하는지 확인하십시오 .
function isNumber(str) {
if (typeof str != "string") return false // we only process strings!
// could also coerce to string: str = ""+str
return !isNaN(str) && !isNaN(parseFloat(str))
}
답변
이 질문에 대한 대답은 몇 가지 다른 사용자가 강조한 바와 같이 몇 가지 결함이 있습니다. 이것은 자바 스크립트로 접근하는 가장 쉽고 입증 된 방법 중 하나입니다.
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
다음은 좋은 테스트 사례입니다.
console.log(isNumeric(12345678912345678912)); // true
console.log(isNumeric('2 ')); // true
console.log(isNumeric('-32.2 ')); // true
console.log(isNumeric(-32.2)); // true
console.log(isNumeric(undefined)); // false
// the accepted answer fails at these tests:
console.log(isNumeric('')); // false
console.log(isNumeric(null)); // false
console.log(isNumeric([])); // false
답변
isNan 함수를 사용해보십시오 :
isNaN () 함수는 값이 잘못된 숫자 (Not-a-Number)인지 판별합니다.
이 함수는 값이 NaN과 같으면 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
이 함수는 숫자 고유의 Number.isNaN () 메소드와 다릅니다 .
전역 isNaN () 함수는 테스트 된 값을 숫자로 변환 한 다음 테스트합니다.
Number.isNan ()은 값을 숫자로 변환하지 않으며 숫자 유형이 아닌 값에 대해서는 true를 반환하지 않습니다.
답변
오래된 질문이지만 주어진 답변에 몇 가지 점이 누락되었습니다.
과학적 표기법.
!isNaN('1e+30')
이다 true
사람들이 번호를 요구하는 경우 그러나 대부분의 경우, 그들은 같은 것들을 일치하지 않습니다 1e+30
.
큰 부동 숫자는 이상하게 동작 할 수 있습니다
관찰 (Node.js 사용) :
> var s = Array(16 + 1).join('9')
undefined
> s.length
16
> s
'9999999999999999'
> !isNaN(s)
true
> Number(s)
10000000000000000
> String(Number(s)) === s
false
>
반면에 :
> var s = Array(16 + 1).join('1')
undefined
> String(Number(s)) === s
true
> var s = Array(15 + 1).join('9')
undefined
> String(Number(s)) === s
true
>
따라서 기대하는 경우 String(Number(s)) === s
문자열을 최대 15 자리로 제한하는 것이 좋습니다 (앞의 0을 생략 한 후).
무한대
> typeof Infinity
'number'
> !isNaN('Infinity')
true
> isFinite('Infinity')
false
>
모든 것을 감안할 때 주어진 문자열이 다음을 모두 만족하는 숫자인지 확인하십시오.
- 비 과학적 표기법
- 예측에 변환
Number
하고 다시String
- 한정된
그렇게 쉬운 일이 아닙니다. 간단한 버전은 다음과 같습니다.
function isNonScientificNumberString(o) {
if (!o || typeof o !== 'string') {
// Should not be given anything but strings.
return false;
}
return o.length <= 15 && o.indexOf('e+') < 0 && o.indexOf('E+') < 0 && !isNaN(o) && isFinite(o);
}
그러나 이것조차도 완전하지 않습니다. 선행 0은 여기서 처리되지 않지만 길이 테스트를 망칩니다.