แปลง NaN เป็น 0 ใน javascript


238

มีวิธีการแปลงค่า NaN เป็น 0 โดยไม่มีคำสั่ง if:

if (isNaN(a)) a = 0;

มันน่ารำคาญมากที่ตรวจสอบตัวแปรของฉันทุกครั้ง


4
คุณไม่สามารถโกศเป็น funcion ได้หรือไม่?
the_drow

นี่เป็นเพียงแค่ 20 ตัวอักษรปัญหาคืออะไร?
Raus 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;

... ซึ่งจะมีผลเช่นเดียวกับข้างต้น


ถ้าเจตนาคือการทดสอบมากกว่าแค่NaNนั้นคุณสามารถทำเช่นเดียวกัน แต่ทำtoNumberแปลงแรก

a = +a || 0

ใช้ตัวดำเนินการ unary + เพื่อลองแปลงaเป็นตัวเลข สิ่งนี้มีประโยชน์เพิ่มเติมของการแปลงสิ่งต่าง ๆ เช่นสตริงตัวเลข'123'ให้เป็นตัวเลข

สิ่งที่ไม่คาดคิดอาจเกิดขึ้นได้ก็ต่อเมื่อมีคนผ่าน Array ที่สามารถแปลงเป็นตัวเลขได้สำเร็จ:

+['123']  // 123

ที่นี่เรามีอาเรย์ที่มีสมาชิกเดียวนั่นคือสตริงตัวเลข มันจะถูกแปลงเป็นตัวเลขได้สำเร็จ


แนวคิดในการเปลี่ยนการตรวจสอบให้เป็นฟังก์ชั่นนั้นดี แต่อันนี้ดูดีกว่า
Tamás Pap

1
@ Bakudan: จุดดี ฉันคิดว่า OP เกี่ยวข้องกับNaNค่าเฉพาะเท่านั้น สิ่งนี้จะไม่ทำงานเป็นการทดสอบค่าที่ไม่ใช่ตัวเลขทั้งหมด แม้ว่าเราสามารถลองแปลงเป็นจำนวนแรกได้ ฉันจะอัปเดต
user113716

... อาจะเป็นเพราะชื่อ"แปลงน่าน 0" อย่างไรก็ตามครอบคลุมทั้งสองวิธีในขณะนี้
user113716

2
ขอบคุณเพื่อนเลือกและแก้ไขบิตนี้ด้วยตัวเอง a = a * 1 || 0
ใครบางคน

น่ากลัว ขอบคุณ
Apit John Ismail

32

การใช้ตัวหนอนสองตัว (ไม่ใช้สองบิต) - ~~- ทำสิ่งที่น่าสนใจใน JavaScript ตัวอย่างเช่นคุณสามารถใช้มันแทนMath.floorหรือแม้กระทั่งเป็นทางเลือกparseInt("123", 10)! มีการพูดคุยกันมากมายผ่านเว็บดังนั้นฉันจะไม่อธิบายว่าทำไมมันจึงทำงานที่นี่ แต่ถ้าคุณสนใจ: ตัวดำเนินการ "double tilde" (~~) ใน JavaScript คืออะไร

เราสามารถใช้ประโยชน์จากคุณสมบัติของตัวหนอนสองตัวเพื่อแปลงNaNเป็นตัวเลขและอย่างมีความสุขที่หมายเลขนั้นเป็นศูนย์!

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
Andrei 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
! ที่น่าสนใจ แค่สงสัยว่ามันตอบสนองอย่างไรเมื่อวาลสามารถเป็นค่าลบได้ เท่าที่ฉันทดสอบไม่มีอะไรผิดปกติ แต่ในกรณีนี้ ...
ลูเซียโน

2

แทนที่จะขุดมันเพื่อให้คุณสามารถทำต่อไปทำไมไม่สำรองข้อมูลและสงสัยว่าทำไมคุณถึงพบ NaN ตั้งแต่แรก?

หากอินพุตตัวเลขใด ๆ ในการดำเนินการเป็น NaN เอาต์พุตก็จะเป็น NaN เช่นกัน นั่นคือวิธีที่มาตรฐาน IEEE Floating Point ทำงานได้ (ไม่ใช่แค่ Javascript) พฤติกรรมนั้นมีเหตุผลที่ดี : ความตั้งใจพื้นฐานคือการป้องกันไม่ให้คุณใช้ผลลัพธ์ปลอมโดยไม่ทราบว่าเป็นการหลอกลวง

วิธีน่านทำงานคือถ้าสิ่งที่ไปลงผิดวิธีในบางย่อยย่อยการดำเนินงาน (การผลิตน่านที่ที่ระดับที่ต่ำกว่า) ผลสุดท้ายจะยังเป็นน่านที่คุณจะรับรู้ได้ทันทีว่าเป็นข้อผิดพลาดแม้ว่าคุณ ข้อผิดพลาดในการจัดการตรรกะ (โยน / จับอาจจะ?) ยังไม่เสร็จสมบูรณ์

NaN เนื่องจากผลลัพธ์ของการคำนวณเลขคณิตเสมอแสดงว่ามีบางสิ่งผิดพลาดในรายละเอียดของเลขคณิต เป็นวิธีที่คอมพิวเตอร์จะพูดว่า "จำเป็นต้องแก้ไขจุดบกพร่องที่นี่" แทนที่จะค้นหาวิธีที่จะดำเนินการต่อด้วยหมายเลขที่ไม่ถูกต้อง (คือ 0 จริงๆสิ่งที่คุณต้องการ?) ทำไมไม่หาปัญหาและแก้ไข

ปัญหาที่พบบ่อยใน Javascript คือทั้งสองอย่างparseInt(...)และparseFloat(...)จะคืน NaN หากได้รับการโต้แย้งที่ไร้สาระ ( null,''ฯลฯ ) แก้ไขปัญหาในระดับต่ำสุดที่เป็นไปได้แทนที่จะเป็นในระดับที่สูงขึ้น จากนั้นผลลัพธ์ของการคำนวณโดยรวมมีโอกาสที่ดีที่จะทำให้เกิดความรู้สึกและคุณไม่ได้แทนที่หมายเลขเวทย์มนตร์ (0 หรือ 1 หรืออะไรก็ตาม) สำหรับผลลัพธ์ของการคำนวณทั้งหมด (เคล็ดลับของ (parseInt (foo.value) || 0) ใช้งานได้เฉพาะกับผลรวมไม่ใช่ผลิตภัณฑ์ - สำหรับผลิตภัณฑ์ที่คุณต้องการให้ค่าเริ่มต้นเป็น 1 แทนที่จะเป็น 0 แต่ไม่ใช่ถ้าค่าที่ระบุคือ 0 จริง ๆ )

บางทีเพื่อความง่ายในการเขียนโค้ดคุณต้องการให้ฟังก์ชันดึงค่าจากผู้ใช้ทำความสะอาดและจัดเตรียมค่าเริ่มต้นหากจำเป็นเช่นนี้

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

2

แล้วregexล่ะ?

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

รหัสด้านล่างจะไม่สนใจ NaN เพื่อให้สามารถคำนวณตัวเลขที่ป้อนอย่างถูกต้อง


2

วิธีการที่ใช้ isNaN ไม่ทำงานหากคุณพยายามใช้ parseInt ตัวอย่างเช่น:

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

โดยสรุปสตริงว่างถือเป็นตัวเลขที่ถูกต้องโดย isNaN แต่ไม่ใช่โดย parseInt ตรวจสอบกับ Safari, Firefox และ Chrome บน OSX Mojave


1
ทางออกหนึ่งที่เห็นได้ชัดคือค่อนข้างยุ่งยากตรวจสอบ NaN หลังจากวิเคราะห์คำไม่ใช่ก่อนหน้านี้: isNaN (parseInt (n))? parseInt (n): 0; // โทรคุยกันสองครั้ง :(
เดวิดโครว์

1
ความคิดเห็นนั้นควรเป็นคำตอบของคุณ!
frandroid

วิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้นถือว่าสตริง null เป็นสิ่งผิดปกติเพียงตัวเดียว: n == "" || isNaN (n)? 0: parseInt (n); (แต่จะเกิดอะไรขึ้นถ้ามีข้อ จำกัด อื่น ๆ )
David Crowe


0

ใช้ผู้ใช้โซลูชัน 113716 ซึ่งเป็นวิธีที่ดีในการหลีกเลี่ยงสิ่งที่ฉันได้นำไปใช้ในการคำนวณช่องผลรวมย่อยของฉันจากหน่วยข้อความและปริมาณกล่องข้อความ

ในการเขียนกระบวนการของตัวเลขที่ไม่ใช่ในกล่องข้อความหน่วยและปริมาณค่าของมันจะถูกแทนที่ด้วยศูนย์ดังนั้นการโพสต์ข้อมูลผู้ใช้ขั้นสุดท้ายจึงไม่มีตัวเลขที่ไม่ใช่ตัวเลข

     <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.