자바 스크립트에서 NaN을 0으로 변환


238

if 문없이 NaN 값을 0으로 변환하는 방법이 있습니까?

if (isNaN(a)) a = 0;

매번 변수를 확인하는 것은 매우 성가신 일입니다.


4
그냥 funcion에 그것을 항아리 수 없습니다?
the_drow

이것은 단지 20 자와 같습니다. 문제는 무엇입니까?
Rusty Fausak

1
function noNaN( n ) { return isNaN( n ) ? 0 : n; }그리고 그냥noNaN( a )
Šime Vidas

1
@rfausak 당신은 일반적으로 자신을 반복하고 싶지 않습니다 ( DRY 참조 ). 특정 기능이 여러 번 필요한 경우 전용 기능이 선호됩니다.
Šime Vidas

답변:


575

당신은 이것을 할 수 있습니다 :

a = a || 0

...을 "falsey"값에서로 변환합니다 0.

"falsey"값은 다음과 같습니다.

  • false
  • null
  • undefined
  • 0
  • "" (빈 문자열)
  • NaN (숫자가 아님)

또는 원하는 경우 :

a = a ? a : 0;

... 위와 같은 효과가 있습니다.


의도가 just 이상을 테스트하려는 경우 NaN동일한 작업을 수행 할 수 있지만 toNumber 변환을 먼저 수행하십시오.

a = +a || 0

단항 + 연산자를 사용하여 a숫자 로 변환하려고합니다 . 숫자 문자열과 같은 것을 변환하는 이점이 있습니다.'123' .

누군가 예상치 못한 것은 숫자로 변환 할 수있는 Array를 전달하는 경우입니다.

+['123']  // 123

여기에 숫자 문자열 인 단일 멤버가있는 Array가 있습니다. 숫자로 성공적으로 변환됩니다.


검증을 기능으로 바꾸는 아이디어는 좋지만 이것은 더 우아합니다.
Tamás Pap

1
@Bakudan : 좋은 지적입니다. OP가 특정 NaN가치 에만 관심이 있다고 생각했습니다 . 숫자가 아닌 모든 값에 대한 테스트로는 작동하지 않습니다. 먼저 toNumber 변환을 시도 할 수 있지만. 업데이트하겠습니다.
user113716

... ah, 제목이 "NaN을 0으로 변환" 때문입니다 . 어쨌든 지금은 두 가지 방법을 모두 다루었습니다.
user113716

2
고마워 친구, 자신을 위해 이것을 선택하고 수정했습니다 a = a * 1 || 0
누군가

대박. 감사합니다
Apit John Ismail 16:23의

32

이중 물결표를 사용하면 (더블 비트 NOT)-- ~~JavaScript에서 흥미로운 작업을 수행합니다. 예를 들어, 대신 Math.floor또는 대안으로 사용할 수 있습니다 parseInt("123", 10)! 웹에서 많이 논의되었으므로 여기서 작동하는 이유는 다루지 않지만 관심이 있다면 JavaScript의 "double tilde"(~~) 연산자는 무엇입니까?

우리는 이중 물결표 의이 속성 NaN을 사용하여 숫자 로 변환 할 수 있으며 행복하게도 숫자는 0입니다!

console.log(~~NaN); // 0


1
고마워, 나는 이것 ~~에 대해 전혀 몰랐다 . 나는 방금 다음과 parseFloat()같이 그것을 사용했다 ~~parseFloat($variable);. 매우 깔끔한 :) +1
Rens Tillmann

23

자신의 방법을 작성하고 숫자 값을 원하는 모든 곳에서 사용하십시오.

function getNum(val) {
   if (isNaN(val)) {
     return 0;
   }
   return val;
}

1
내가 통과하면 null의 예상 결과를 얻지 못합니다 0. 자세한 내용은 여기 내 포인트는 : stackoverflow.com/questions/115548/why-is-isnannull-false-in-js
안드레이 Bazanov

2
위의 의견에 더하여, 나는 어쨌든 그것을 알아낼 수 없을 때 Number(val)돌아 오는 대신 대신 사용했습니다 0.
Andrei Bazanov

4

무엇보다 간단하고 효과적인 것 :

function getNum(val) {
   val = +val || 0
   return val;
}

...을 "falsey"값에서로 변환합니다 0.

"falsey"값은 다음과 같습니다.

  • false
  • null
  • undefined
  • 0
  • "" (빈 문자열)
  • NaN (숫자가 아님)

1
흥미 롭습니다! val이 음수 값일 때 어떻게 반응하는지 궁금합니다. 내가 테스트 한 한, 이것에 아무 문제가 없지만, 만일을 위해 ...
Luciano

2

계속해서 사용할 수 있도록하기보다는 백업하지 말고 왜 처음에 NaN을 사용하는지 궁금하십니까?

연산에 대한 숫자 입력이 NaN 인 경우 출력도 NaN이됩니다. 이것이 현재 IEEE 부동 소수점 표준이 작동하는 방식입니다 (Javascript만이 아닙니다). 그 행동은 좋은 이유입니다 . 근본적인 의도는 가짜를 깨닫지 않고 가짜 결과를 사용하지 못하게하는 것입니다.

NaN이 작동하는 방식은 일부 하위 하위 작업에서 문제가 발생하면 (낮은 수준에서 NaN 생성) 최종 결과는 NaN이되어 NaN이됩니다. 오류 처리 로직 (throw / catch 어쩌면?)이 아직 완료되지 않았습니다.

산술 계산의 결과로 NaN 항상 세부 사항에서 무언가 잘못되었다는 것을 나타냅니다. 컴퓨터가 "여기에 논쟁이 필요하다"고 말하는 방법입니다. 어쨌든 거의 맞지 않는 숫자 (0은 실제로 원하는 것입니까?)로 계속 진행하는 방법을 찾는 대신 문제를 찾아서 해결하십시오.

Javascript의 일반적인 문제 는 무의미한 인수가 주어지면 NaN을 반환 parseInt(...)하고 parseFloat(...)반환 한다는 것입니다.null ,'' 등). 높은 수준이 아닌 가능한 가장 낮은 수준에서 문제를 해결하십시오. 그런 다음 전체 계산 결과가 의미가있을 가능성이 높으며 전체 계산 결과에 마법의 숫자 (0 또는 1 등)를 대치하지 않습니다. ((parseInt (foo.value) || 0)의 트릭은 제품이 아닌 합계에 대해서만 작동합니다. 제품의 경우 기본값이 0이 아닌 1이 되길 원하지만 지정된 값이 실제로 0이면 그렇지 않습니다.

코딩이 쉽도록 사용자가 값을 가져 와서 정리하고 필요한 경우 기본값을 제공하는 함수가 필요합니다.

function getFoobarFromUser(elementid) {
        var foobar = parseFloat(document.getElementById(elementid).innerHTML)
        if (isNaN(foobar)) foobar = 3.21;       // default value
        return(foobar.toFixed(2));
}

2

방법에 대한 정규식 ?

function getNum(str) {
  return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}

아래 코드는 NaN을 무시하여 올바르게 입력 한 숫자를 계산할 수 있도록합니다.


2

parseInt를 사용하려고하면 isNaN을 사용하는 메소드가 작동하지 않습니다. 예를 들면 다음과 같습니다.

parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14

그러나 두 번째 경우 isNaN은 false를 생성합니다 (예 : null 문자열은 숫자 임)

n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14

요약하면 null 문자열은 isNaN에서 유효한 숫자로 간주되지만 parseInt에서는 유효하지 않습니다. OSX Mojave의 Safari, Firefox 및 Chrome에서 확인되었습니다.


1
하나의 명백한 해결책은 약간 성가시다. parseInt (n) : 0; // parseInt를 두 번 호출 :(
David Crowe

1
그 의견은 (시작의) 답이어야합니다!
frandroid

보다 효율적인 솔루션은 널 문자열이 유일한 예외라고 가정합니다. n == ""|| isNaN (n)? 0 : parseInt (n); (그러나 다른 줄이 있다면 어떨까요?)
David Crowe

1
var i = [NaN, 1,2,3];

var j = i.map(i =>{ return isNaN(i) ? 0 : i});

console.log(j)

[0,1,2,3]


0

사용자 113716 솔루션을 사용하면 다른 모든 경우를 피하는 것이 좋습니다. 텍스트 상자 단위 및 텍스트 상자 수량에서 내 소계 텍스트 상자를 계산하기 위해이 방법을 구현했습니다.

단위 및 수량 텍스트 상자에 숫자가 아닌 숫자를 쓰는 과정에서 값이 0으로 바뀌므로 사용자 데이터의 최종 게시에는 숫자가 없습니다.

     <script src="/common/tools/jquery-1.10.2.js"></script>
     <script src="/common/tools/jquery-ui.js"></script>

     <!----------------- link above 2 lines to your jquery files ------>





    <script type="text/javascript" >
    function calculate_subtotal(){

    $('#quantity').val((+$('#quantity').val() || 0));
    $('#unit').val((+$('#unit').val() || 0));

    var  calculated = $('#quantity').val() * $('#unit').val() ;
    $('#subtotal').val(calculated);


    }
    </script>


      <input type = "text" onChange ="calculate_subtotal();" id = "quantity"/>
      <input type = "text" onChange ="calculate_subtotal();" id = "unit"/>
      <input type = "text" id = "subtotal"/>

0

이 간단한 기능을 사용해보십시오

var NanValue = function (entry) {
    if(entry=="NaN") {
        return 0.00;
    } else {
        return entry;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.