খালি স্ট্রিংয়ের জন্য কীভাবে পার্সেন্ট থেকে NaN পরিবর্তন করবেন?


298

NaNজাভাস্ক্রিপ্টে মানগুলি পার্সিং করার পরিবর্তে কোনওভাবে 0 ফিরিয়ে দেওয়া কি সম্ভব ?

খালি স্ট্রিং ক্ষেত্রে parseIntআয় NaN

জাভাস্ক্রিপ্টে চেক করার জন্য এমন কি কিছু করা সম্ভব NaN?

var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)

বা হতে পারে অন্য কোনও ফাংশন বা jQuery প্লাগইন যা অনুরূপ কিছু করতে পারে?


72
এফওয়াইআই NaN != NaN,। আপনি প্রয়োজন চাই isNaN(value)
pimvdb

28
হ্যাঁ, কোনও দুটি ন্যানি একই নয়;)
জেমস পি।

3
ফাংশন parseInt()দু'বার কল করা (সফল / সাধারণ নন- NaNক্ষেত্রে) কখনই ভাল ধারণা নয়। অদক্ষতা ছাড়াও অজ্ঞানীদের জন্য যদি পাস করা tbbহয় তবে পার্শ্ব-প্রতিক্রিয়াযুক্ত ফাংশন কলটি এটি ভয়ানক। আমি যেখানে parseInt()দুবার দেখি সেখানে কোনও সমাধান আমি ব্যবহার করব না ।
জনব্রেভ

উত্তর:


756
var s = '';

var num = parseInt(s) || 0;

বুলিয়ান মানগুলির সাথে ব্যবহার না করা হলে লজিক্যাল ওআর ( ||) অপারেটর প্রথম এক্সপ্রেশনটি ( parseInt(s)) সত্য করে যদি এটি মূল্যায়ন করা যায় তবে ফিরে আসে, অন্যথায় এটি দ্বিতীয় প্রকাশ (0) প্রদান করে। এর রিটার্ন মান parseInt('')হল এনএন Na NaN মিথ্যাতে মূল্যায়ন করে, তাই num0 এ সেট হয়ে যায়।


6
S = "4s" থাকলে এটি কাজ করবে না; (এটি 4
ফেরায়


26
@markzzz আবার প্রশ্ন পড়ুন। ওপি জিজ্ঞাসা করেছে: " এনএএন এর পরিবর্তে কোনওভাবে 0 ফিরিয়ে দেওয়া কি সম্ভব "? ওপি চেক করতে চায় না, নির্দিষ্ট স্ট্রিংটি ইন্টে পার্সেবল হয় কিনা। ওপি 0পরিবর্তে পেতে চায় NaN। এটি ম্যাট এর কোড দ্বারা নিখুঁতভাবে সমাধান করা হয়।
ট্রাজডার

2
@মার্কজজvar nextIphone = parseInt("4S") + 1; // wow it works!
জিরো

2
@ ম্যাথু দয়া করে "মিথ্যা" বা "সত্যবাদী" শব্দটি ব্যবহার করুন । কারণ NaN === মিথ্যা মিথ্যা! তবে বুলিয়ান (NaN) === বুলিয়ান (মিথ্যা) সত্য। লজিক্যাল ওআর প্রথম প্রকাশটি
পাবলো

51

আপনি isNaN()ফাংশনটি ব্যবহার করতে পারেন :

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)

12
parseInt(s)দু'বার ফোন কেন ? তদ্ব্যতীত এটি হওয়া উচিতparseInt(s, 10)
অক্সিজেন

2
@ জর্জেজেম্পি "10" এর একটি মূলসূত্র ডিফল্ট; যে পরামিতি alচ্ছিক। parseInt()দু'বার কল করার ক্ষেত্রে ভাল বক্তব্য ।
শারদ লিওনার্ড

8
@ অটমনিওনার্ড এটি কেবল এক ধরণের সত্য। যদি আপনার স্ট্রিং 0 দিয়ে শুরু হয় তবে ধরে নেওয়া হয় সংখ্যাটি অষ্টাল ফর্ম্যাটে রয়েছে সুতরাং পার্সেন্ট ('077') আপনাকে 63 দেয় This এটি বাগগুলি সন্ধান করতে খুব বাজে হতে পারে যাতে আপনার সর্বদা দ্বিতীয় পরামিতি নির্দিষ্ট করা উচিত। উদাহরণস্বরূপ দেখুন stackoverflow.com/questions/8763396/...
chuck258

22

কারও ব্যবহারের কথা উল্লেখ না করে আমি অবাক হয়ে গেলাম Number()। মঞ্জুর করা থাকলে এটি দশমিকের পার্স হবে, যদি এটি সরবরাহ করা হয় parseInt()তবে এর চেয়ে আলাদাভাবে কাজ করবে , তবে এটি ইতিমধ্যে 10 বেসকে ধরে নিয়েছে এবং "" বা "" 0-এ পরিণত হবে।


1
হ্যাঁ, লোকালস্টোর থেকে পড়ার জন্য খুব সুবিধাজনক: সংখ্যা (লোকালস্টোরেজ.জেট আইটেম ('অ্যাপব্যানার.কাউন্ট')) + 1
ফিলিপ মারফি

প্রশ্নটি যেমন জিজ্ঞাসা করা হয়েছিল তেমন কাজ করে, এটি এখনও নন-নন-হোয়াইটস্পেস অক্ষরগুলির জন্য NaN প্রদান করে
কাইল ডেলানি

9

সীমাবদ্ধ নয় এমন লোকদের জন্য parseInt, আপনি বিটওয়াই ওআর অপারেটরটি ব্যবহার করতে পারেন (যা ToInt32স্পষ্টভাবে এর অপারেশনগুলিতে কল করে)।

var value = s | 0;

// NaN | 0     ==>> 0
// ''  | 0     ==>> 0
// '5' | 0     ==>> 5
// '33Ab' | 0  ==>> 0
// '0x23' | 0  ==>> 35
// 113 | 0     ==>> 113
// -12 | 0     ==>> -12
// 3.9 | 0     ==>> 3

দ্রষ্টব্য: এর ToInt32থেকে পৃথক parseInt। (অর্থাত্ parseInt('33Ab') === 33)


কিন্তু: '10000000000' | 0 === 1410065408
ট্রিনকোট

@ ট্রিনকোট হ্যাঁ, যে কোনও মান> = Math.pow(2, 31)উপচে পড়বে।
আহমদ ইব্রাহিম

8

সমস্যাটি

অন্যান্য উত্তরগুলি 0মিথ্যা বলে বিবেচনা করে না এবং সুতরাং নিম্নলিখিতগুলির পরিবর্তে 0 হবে 20:

const myNumber = parseInt('0') || 20; // 20

সমাধান

আমি একটি সহায়ক ফাংশন প্রস্তাব করি যা বেশিরভাগ সমস্যার সমাধান করে:

function getNumber({ value, defaultValue }) {
  const num = parseInt(value, 10);
  return isNaN(num) ? defaultValue : num;
}

সহায়ক ফাংশন নিম্নলিখিত ফলাফল দেবে:

getNumber({ value: "0", defaultValue: 20 }); // 0
getNumber({ value: "2", defaultValue: 20 }); // 2
getNumber({ value: "2.2", defaultValue: 20 }); // 2
getNumber({ value: "any string", defaultValue: 20 }); // 20
getNumber({ value: undefined, defaultValue: 20 }); // 20
getNumber({ value: null, defaultValue: 20 }); // 20
getNumber({ value: NaN, defaultValue: 20 }); // 20
getNumber({ value: false, defaultValue: 20 }); // 20
getNumber({ value: true, defaultValue: 20 }); // 20

2
দয়া করে parseInt করার জন্য একটি র্যাডিক্স পাঠান: parseInt(string, radix), এই বিবেচনা করুন: parseInt("0x10") === 16এছাড়াও parseInt("010")উত্পাদ পারে 8কিছু কিছু ব্রাউজারে
andlrc

2
আপনি যদি ইতিমধ্যে অন্যান্য জিনিসগুলির জন্য লোডাসের উপর নির্ভর করে থাকেন তবে একটি defaultToকার্যকর ফাংশন রয়েছে যা কেবল এটি করে: _.defaultTo(NaN, -1)ফিরে আসে -1, কিন্তু _.defaultTo(0, -1);ফিরে আসে 0
প্রাচীর

এটি একটি দুর্দান্ত পয়েন্ট! আপনি কেবল || আপনার পছন্দসই ডিফল্টটি জিরো হ'ল শেষে সঠিক ডিফল্ট সরবরাহ করার জন্য (মঞ্জুরিপ্রাপ্ত, ওপি এটিই চেয়েছিল)। যেমনটি আপনি উল্লেখ করেছেন, '0' ইনপুটটির মিথ্যা প্রকৃতির কারণে, এটি এক্ষেত্রে অবৈধ ইনপুট হিসাবে বিবেচিত হবে এবং বিবৃতিটি এর পরিবর্তে ডিফল্ট মানটি প্রত্যাবর্তন করবে (সম্ভবত প্রত্যাশিত প্রত্যাশা ছিল না!)
জনাথন

অবশ্যই আপনার parseIntদুবার কল করার পরিবর্তে একটি কনস্ট ব্যবহার করা উচিত
কাইল ডেল্যানি

4

কাজটি পার্সআইটেনের চেয়ে অনেক বেশি ক্লিনার বলে আমার মতে, + অপারেটরটি ব্যবহার করুন

var s = '';
console.log(+s);

var s = '1024'
+s
1024

s = 0
+s
0

s = -1
+s
-1

s = 2.456
+s
2.456

s = ''
+s
0

s = 'wtf'
+s
NaN

1
খুব কমপ্যাক্ট। কী লজ্জাজনক যে আপনি বেশি পয়েন্ট পেলেন না। আমি আপনাকে ভোট দিয়েছি। একটি নিঃশব্দ ট্রোল দ্বারা আজ অর্জিত আমার -2 ধরার চেষ্টা করার জন্য দয়া করে প্রতিদান দিন ... (এই পৃষ্ঠার শেষে আমার উত্তর দেখুন)। ধন্যবাদ.
ফাবিয়েন হাদ্দাদি


1

একটি খালি স্ট্রিং (যেমন এটি একটি নির্দিষ্ট ক্ষেত্রে) এর জন্য পৃথক চেক করুন এবং এ ক্ষেত্রে এটি শূন্যতে সেট করুন।

আপনি শুরুর দিকে "0" যুক্ত করতে পারেন, তবে তারপরে আপনাকে একটি উপসর্গ যুক্ত করতে হবে এটি নির্দেশ করে যে এটি দশমিক এবং অষ্টাল সংখ্যা নয়


সুতরাং আপনি কি মনে করেন যে খালি থাকলে 0 যুক্ত করা ভাল?
জোপার

1
না - এটি আমি ব্যবহার করেছি এমন একটি পদ্ধতি approach এই ক্ষেত্রে, একটি পৃথক চেক ওউডল আরও ভাল। তবে যদি ম্যাট সলিউশনটি কাজ করে তবে এটি আরও পরিষ্কার।
শ্রয়েডিংগার্স বিড়াল

1

ফাংশনটি ওভাররাইড করবেন না কেন? সেক্ষেত্রে আপনি সর্বদা নিশ্চিত হতে পারেন যে এটির 0ক্ষেত্রে এটি ফিরে আসে NaN:

(function(original) {
    parseInt = function() {
        return original.apply(window, arguments) || 0;
    };
})(parseInt);

এখন, আপনার কোডের যে কোনও জায়গায়:

parseInt('') === 0

15
এই জাতীয় ফাংশনটি ওভাররাইড করা বিশেষজ্ঞ জাভাস্ক্রিপ্ট প্রোগ্রামারদের বিভ্রান্ত করতে পারে যারা এটি বাগ হিসাবে দেখতে পারে see আপনার ওভাররাইড করা ফাংশনটি এমন কোনও জায়গায় কবর দেওয়া হতে পারে যেখানে এটি দেখা যায় না। এটি সৃজনশীল, তবে আমি নিশ্চিত নই যে || 0ম্যাট এর উত্তরে কেবল যুক্ত করা কতটা সহজ তা বিবেচনা করে আমি ব্যক্তিগতভাবে এটির পরামর্শ দেব । আমি দেখতে পাচ্ছি যে আপনার নিজের মালিকানা শেষ অবলম্বন হিসাবে নেই বা এটি না করার সময় ও জটিলতার দিক থেকে উল্লেখযোগ্যভাবে বেশি খরচ হবে।
jmort253

2
আমি @ jmort253 এর সাথে একমত ... এটি বিপজ্জনক কারণ ফাংশনটি খুব স্মার্ট। ঠিক একই ফাংশনটি করা ভাল তবে getSafeNumberValue বা এর মতো কোনও নামের সাথে।
স্যামুয়েল

1

আমার মতো সরল স্ট্রিং সহ একই রকম সমস্যা (ফায়ারফক্স ভি 34) ছিল:

var myInt = parseInt("b4");

তাই আমি এর একটি দ্রুত হ্যাক নিয়ে এসেছি:

var intVal = ("" + val).replace(/[^0-9]/gi, "");

এবং তারপরে অ-সরল স্টাফের জন্য ফ্লোট + ইনসটি মোকাবেলায় সমস্ত বোকা জটিল হয়ে পড়ে:

var myval = "12.34";

function slowParseNumber(val, asInt){
    var ret = Number( ("" + val).replace(/[^0-9\.]/gi, "") );
    return asInt ? Math.floor(ret) : ret;
}
var floatVal = slowParseNumber(myval);

var intVal = slowParseNumber(myval, true);
console.log(floatVal, intVal);

এটি 0 এর মত জিনিসের জন্য ফিরে আসবে:

var intVal = slowParseNumber("b"); // yeilds 0

1
//////////////////////////////////////////////////////
function ToInt(x){x=parseInt(x);return isNaN(x)?0:x;}
//////////////////////////////////////////////////////
var x = ToInt('');   //->  x=0
    x = ToInt('abc') //->  x=0
    x = ToInt('0.1') //->  x=0
    x = ToInt('5.9') //->  x=5
    x = ToInt(5.9)   //->  x=5
    x = ToInt(5)     //->  x=5

আপনি কি এই সমাধানটি ব্যাখ্যা করতে পারেন?
রামেন শেফ

আপনি যদি কোনও সংখ্যা (যেমন '123' বা 123) তে পূর্ণসংখ্যায় রূপান্তর করতে চান, আপনি যদি পার্সেন্ট ('এবিসি') ব্যবহার করেন,
আব্দুলরহমান আলশামিরি

আপনি যদি পার্সেন্ট ব্যবহার করেন ('এবিসি') আপনি
নাএন

বিঙ্গো, ||পদ্ধতির স্পষ্ট বিকল্প হিসাবে । আমি জানি এটি একটি পুরানো প্রশ্ন এবং উত্তর, তবে এই উত্তরটি দু'বার পার্সিয়ান্ট কল করা এড়িয়ে যায় এবং ইসন নানকে সঠিকভাবে ব্যবহার করে। এটি কেবলমাত্র Radix parseInt(x, 10)সম্পূর্ণরূপে প্রয়োজন। (আমার পছন্দ পুনরায় ব্যবহারের পরিবর্তে পৃথক অভ্যন্তরীণ পরিবর্তনশীল x
vari

1

আমার জন্য এটি পরিচালনা করতে আমি একটি 2 টি প্রোটোটাইপ তৈরি করেছি, একটি সংখ্যার জন্য একটি এবং একটি স্ট্রিংয়ের জন্য।

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

// returns the int value or -1 by default if it fails
Number.method('tryParseInt', function (defaultValue) {
    return parseInt(this) == this ? parseInt(this) : (defaultValue === undefined ? -1 : defaultValue);
});

// returns the int value or -1 by default if it fails
String.method('tryParseInt', function (defaultValue) {
    return parseInt(this) == this ? parseInt(this) : (defaultValue === undefined ? -1 : defaultValue);
});

আপনি যদি সুরক্ষা চেকটি ব্যবহার করতে না চান তবে ব্যবহার করুন

String.prototype.tryParseInt = function(){
    /*Method body here*/
};
Number.prototype.tryParseInt = function(){
     /*Method body here*/
};

ব্যবহারের উদাহরণ:

var test = 1;
console.log(test.tryParseInt()); // returns 1

var test2 = '1';
console.log(test2.tryParseInt()); // returns 1

var test3 = '1a';
console.log(test3.tryParseInt()); // returns -1 as that is the default

var test4 = '1a';
console.log(test4.tryParseInt(0));// returns 0, the specified default value

1
// implicit cast
var value = parseInt(tbb*1); // see original question

ব্যাখ্যা, যারা এটি তুচ্ছ বলে মনে করেন না:

এক দ্বারা গুণমান, "অন্তর্নিহিত কাস্ট" নামক একটি পদ্ধতি, অজানা টাইপ অপারেন্ডকে আদিম ধরণের 'সংখ্যায়' পরিণত করার চেষ্টা করে। বিশেষত, একটি খালি স্ট্রিং 0 নম্বর হয়ে উঠবে, এটিকে পার্সেন্ট () এর জন্য যোগ্য টাইপ করে তোলে ...

উপরে পাইরেটএপও খুব ভাল উদাহরণ দিয়েছিলেন, যিনি জাভাস্ক্রিপ্টকে নম্বরের অন্তর্নিহিত কাস্ট ব্যবহার করতে বাধ্য করে, + সাইনটি প্রিপেন্ড করার পরামর্শ দিয়েছিলেন।


এটি প্রিয় প্রশ্নের মূল প্রশ্নের সরাসরি উত্তর।
ফ্যাবিয়েন হাদ্দাদি

এটি এর জন্য করবে নাparseInt('str'*1)
রোডিয়ন বাসকাকভ

parseIntইতিমধ্যে একটি নম্বর যে কিছু কল কেন ? এটি আবার সংখ্যায় রূপান্তর করতে কেবল স্ট্রিং-এ আবার রূপান্তর করতে পারে।
ট্রিনকোট

0

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

var Nanprocessor = function (entry) {
    if(entry=="NaN") {
        return 0;
    } else {
        return entry;
    }
}

 outputfield.value = Nanprocessor(x); 

// where x is a value that is collected from a from field
// i.e say x =parseInt(formfield1.value); 

এটা কি ভুল হচ্ছে?


হাই, ওয়াট আমাদের উপরের পদ্ধতি অনুসরণ করতে বাধা দিচ্ছে। জানতে শিখতে চাই।
নরেশ

3
পরীক্ষার জন্য আপনার isNaN ব্যবহার করা উচিত NaN
ম্যাথু

2
থ্যাঙ্কস ম্যাট :) আমি জানি না যে জাভাস্ক্রিপ্টে ইসনন () নামে একটি ফাংশন আছে! আমাকে জানতে দেওয়ার জন্য ধন্যবাদ...!
নরেশ

0

এখানে আমি চেষ্টা করছি এমন একটি ট্রান্সপার্সেন্ট পদ্ধতি, এটি দ্বিতীয় প্যারামিটার হিসাবে ডিফল্ট মান নেয় যাতে এটি আপনার প্রয়োজনীয় কিছু হতে পারে।

function tryParseInt(str, defaultValue) {
    return parseInt(str) == str ? parseInt(str) : defaultValue;
}

tryParseInt("", 0);//0 
tryParseInt("string", 0);//0 
tryParseInt("558", 0);//558

0

একটি সহায়ক ফাংশন যা এখনও রেডিক্স ব্যবহারের অনুমতি দেয়

function parseIntWithFallback(s, fallback, radix) {
    var parsed = parseInt(s, radix);
    return isNaN(parsed) ? fallback : parsed;
}

0

আপনার খুব পরিষ্কার কোড থাকতে পারে, আমারও একই সমস্যা ছিল এবং আমি এটি ব্যবহার করে সমাধান করেছি:

var a="bcd";
~~parseInt(a);

0

এই সমাধানটির সন্ধানকারী অন্যান্য ব্যক্তিদের জন্য, কেবলমাত্র ব্যবহার করুন: ars পার্সেন্ট ছাড়া এটিই সবচেয়ে পরিষ্কার মোড।

var a = 'hello';
var b = ~~a;

যদি NaN হয় তবে এটি 0 এর পরিবর্তে ফিরে আসবে।

OBS। এই সমাধানটি শুধুমাত্র পূর্ণসংখ্যার জন্য প্রযোজ্য

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