জাভাস্ক্রিপ্টে NaN 0 তে রূপান্তর করুন


238

যদি কোনও বিবৃতি ছাড়াই নাএন মানকে 0 তে রূপান্তর করার উপায় আছে:

if (isNaN(a)) a = 0;

প্রতিবার আমার ভেরিয়েবলগুলি পরীক্ষা করা খুব বিরক্তিকর।


4
আপনি কি এটাকে শুধু ফানসিওনে পরিণত করতে পারবেন না?
the_drow

এটি কেবল 20 টি চরিত্রের মতোই সমস্যা কী?
মরিচা ফাসাক

1
function noNaN( n ) { return isNaN( n ) ? 0 : n; }এবং তারপরেnoNaN( a )
4ime Vidas

1
@ আরফাউসাক আপনি সাধারণত নিজেকে পুনরাবৃত্তি করতে চান না ( DRY দেখুন )। যদি একটি নির্দিষ্ট কার্যকারিতা একাধিকবার প্রয়োজন হয়, একটি উত্সর্গীকৃত ফাংশন পছন্দ হয়।
Vidime Vidas

উত্তর:


575

তুমি এটি করতে পারো:

a = a || 0

... যা কোনও "ভুয়া" মান থেকে রূপান্তর করবে 0

"ভুয়া" মানগুলি হ'ল:

  • false
  • null
  • undefined
  • 0
  • "" ( খালি স্ট্রিং )
  • NaN (একটি সংখ্যা নয়)

বা এটি যদি আপনি পছন্দ করেন:

a = a ? a : 0;

... যা উপরের মত একই প্রভাব ফেলবে।


অভিপ্রায়টি যদি কেবলমাত্র না হয়ে আরও বেশি পরীক্ষা করার জন্য হয় NaNতবে আপনিও এটি করতে পারেন তবে প্রথমে একটি টু নাম্বার রূপান্তরটি করুন।

a = +a || 0

এটি aএকটি সংখ্যায় রূপান্তর করতে চেষ্টা করতে অ্যানারি + অপারেটর ব্যবহার করে । সংখ্যাযুক্ত স্ট্রিংয়ের মতো জিনিসগুলিকে '123'একটি সংখ্যায় রূপান্তর করার এতে অতিরিক্ত সুবিধা রয়েছে ।

কেবলমাত্র অপ্রত্যাশিত জিনিসটি হতে পারে যদি কেউ কোনও অ্যারে পাস করে যা সফলভাবে একটি সংখ্যায় রূপান্তর করতে পারে:

+['123']  // 123

এখানে আমাদের একটি অ্যারে রয়েছে যার একটি একক সদস্য রয়েছে এটি একটি সংখ্যার স্ট্রিং। এটি সফলভাবে একটি সংখ্যায় রূপান্তরিত হবে।


যাচাইকরণটিকে কোনও ফাংশনে রূপান্তরিত করার ধারণাটি ভাল তবে এটি আরও মার্জিত।
ট্যামস পাপ

1
@ বাকুদন: ভালো কথা। আমি ভাবছিলাম ওপি কেবলমাত্র নির্দিষ্ট NaNমান নিয়ে উদ্বিগ্ন । এটি সমস্ত অ-সংখ্যা মানের জন্য পরীক্ষা হিসাবে কাজ করবে না। যদিও আমরা প্রথমে একটি নাম্বার রূপান্তর চেষ্টা করতে পারি। আমি আপডেট করব।
ব্যবহারকারী 113716

... আহ, এটি "রূপান্তর NaN তে 0" শিরোনামের কারণে । যাইহোক, এখন উভয় উপায়ে আবরণ।
ব্যবহারকারী 113716

2
ধন্যবাদ সাথী, নিজের জন্য এটি একটি = অ * 1 1 || নির্বাচিত এবং কিছুটা সংশোধন করেছেন 0
কেউ

অসাধারণ. ধন্যবাদ
এপিট জন ইসমাইল

32

একটি ডাবল-টিলড (ডাবল বিটওয়াইজ নট) - ~~- জাভাস্ক্রিপ্টে কিছু আকর্ষণীয় কাজ করে। উদাহরণস্বরূপ আপনি এর পরিবর্তে Math.floorবা এমনকি বিকল্প হিসাবে এটি ব্যবহার করতে পারেন parseInt("123", 10)! এটি ওয়েবে প্রচুর আলোচনা করা হয়েছে, সুতরাং এটি এখানে কাজ করে কেন আমি সেখানে যাব না তবে আপনি যদি আগ্রহী হন: জাভাস্ক্রিপ্টে "ডাবল টিল্ড" (~~) অপারেটর কী?

আমরা NaNএকটি সংখ্যায় রূপান্তর করতে ডাবল-টিলডের এই সম্পত্তিটি কাজে লাগাতে পারি , এবং আনন্দের সাথে সেই সংখ্যাটি শূন্য!

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


1
ধন্যবাদ, আমি এই সম্পর্কে জানেন না ~~এ সব, আমি শুধু দিকে এটি ব্যবহৃত সঙ্গে parseFloat()যেমন: ~~parseFloat($variable);। খুব ঝরঝরে :) +1
রেনস টিলম্যান

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যখন এটি কোনও উপায়ে বুঝতে পারে না তখন তা ফিরে আসে ।
আন্দ্রেই বাজনভ

4

যে কোনও কিছুর জন্য সহজ এবং কার্যকর কিছু:

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

... যা কোনও "ভুয়া" মান থেকে রূপান্তর করবে 0

"ভুয়া" মানগুলি হ'ল:

  • false
  • null
  • undefined
  • 0
  • "" ( খালি স্ট্রিং )
  • NaN (একটি সংখ্যা নয়)

1
মজাদার! ভল যখন একটি নেতিবাচক মান হতে পারে তখন এটি কীভাবে প্রতিক্রিয়া করছে তা কেবল ভাবছি। যতদূর আমি পরীক্ষা করেছি এতে কোনও ভুল নেই, তবে কেবল ক্ষেত্রে ...
লুসিয়ানো

2

এটি চালিয়ে যাওয়ার পরিবর্তে আপনি চালিয়ে যেতে পারেন, কেন ব্যাক আপ করবেন না এবং অবাক হন না কেন আপনি প্রথম স্থানে কোনও এনএএন তে চলেছেন?

অপারেশনে সংখ্যার ইনপুটগুলির কোনও যদি NaN হয় তবে আউটপুটও NaN হবে। বর্তমান আইআইইই ফ্লোটিং পয়েন্ট স্ট্যান্ডার্ডটি সেভাবে কাজ করে (এটি কেবল জাভাস্ক্রিপ্ট নয়)। সেই আচরণটি একটি ভাল কারণের জন্য : অন্তর্নিহিত উদ্দেশ্য হ'ল এটি আপনাকে জালিয়াতি না বুঝে কোনও বোগাস ফলাফল ব্যবহার করা থেকে বিরত রাখা।

পথ NaN কাজ করে কিছু কিছু উপ-উপ-উপ-অপারেশনে কুপথ নিচে (যে নিম্ন স্তরের একটি NaN উত্পাদক), চূড়ান্ত ফলাফল হবে যায় হয় এছাড়াও নান যা আপনি অবিলম্বে এমনকি যদি একটি ত্রুটি হিসাবে স্বীকৃতি করব হতে আপনার তর্ক পরিচালনা করার ক্ষেত্রে ত্রুটি (সম্ভবত ছোঁড়া / ধরা?) এখনও সম্পূর্ণ হয়নি।

গাণিতিক গণনার ফলাফল হিসাবে এনএএন সর্বদা নির্দেশ করে যে গাণিতিকের বিশদগুলিতে কিছু খারাপ হয়ে গেছে। এটি কম্পিউটারের জন্য "এখানে ডিবাগিং প্রয়োজন" বলার একটি উপায়। কিছু সংখ্যক যা এখনও খুব সহজেই সঠিকভাবে চালিয়ে যাওয়ার কোনও উপায় সন্ধান করার পরিবর্তে (আসলেই আপনি যা চান তাই করতে চান?), কেন সমস্যাটি খুঁজে বের করে তা সমাধান করবেন না।

জাভাস্ক্রিপ্ট মধ্যে একটি সাধারণ সমস্যা উভয় যে parseInt(...)এবং parseFloat(...)NaN ফিরে আসবে যদি একটি অর্থহীন যুক্তি (প্রদত্ত null, ''ইত্যাদি)। উচ্চতর স্তরের পরিবর্তে সমস্যাটি সর্বনিম্ন স্তরে সম্ভব স্থির করুন। তারপরে সামগ্রিক গণনার ফলাফলটি বোঝার ভাল সুযোগ রয়েছে এবং আপনি পুরো গণনার ফলাফলের জন্য কিছু ম্যাজিক সংখ্যা (0 বা 1 বা যাই হোক না কেন) প্রতিস্থাপন করছেন না। ((পার্সিয়ান্ট (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

যে পদ্ধতিগুলি nNN ব্যবহার করে সেগুলি কাজ করে না যদি আপনি পার্সেন্ট ব্যবহার করার চেষ্টা করছেন তবে উদাহরণস্বরূপ:

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

তবে দ্বিতীয় ক্ষেত্রে isNaN মিথ্যা উত্পাদন করে (যেমন নাল স্ট্রিং একটি সংখ্যা)

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

সংক্ষেপে, নাল স্ট্রিংটি isNaN দ্বারা একটি বৈধ সংখ্যা হিসাবে বিবেচিত হয় তবে পার্সেন্টের মাধ্যমে নয়। ওএসএক্স মোজভেভে সাফারি, ফায়ারফক্স এবং ক্রোম দিয়ে যাচাই করা হয়েছে।


1
একটি সুস্পষ্ট সমাধান হ'ল কিছুটা জটিল, পার্সেন্ট এর পরে NaN পরীক্ষা করুন, এর আগে নয়: isNaN (parseInt (n))? parseInt (n): 0; // দুটি বার পার্স ইন্ট করুন :(
ডেভিড ক্রো

1
মন্তব্যটি আপনার উত্তর হওয়া উচিত (শুরুতে)!
ফ্রেড্রয়েড

আরও কার্যকর সমাধান অনুমান করে যে নাল স্ট্রিংটি একমাত্র অসাধারণ: n == "" || isNaN (n)? 0: parseInt (n); (তবে অন্য স্ট্রিং থাকলে কী হবে?)
ডেভিড ক্রো


0

ব্যবহারকারী 113716 সমাধানটি ব্যবহার করে, যা সেই সমস্ত এড়াতে দুর্দান্ত is অন্যথায় আমি এটি পাঠ্যবক্স ইউনিট এবং পাঠ্যবক্সের পরিমাণ থেকে আমার উপমোটিক পাঠ্যবক্স গণনা করার জন্য এইভাবে এটি প্রয়োগ করেছি।

ইউনিট এবং পরিমাণের পাঠ্য বাক্সগুলিতে অ-সংখ্যা লেখার প্রক্রিয়াতে, তাদের মানগুলি শূন্য দ্বারা প্রতিস্থাপিত হয় সুতরাং ব্যবহারকারীর ডেটা চূড়ান্ত পোস্টিংয়ের কোনও অ-সংখ্যা নেই।

     <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"/>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.