[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은 여기서 처리되지 않지만 길이 테스트를 망칩니다.