চরিত্র সংখ্যা কিনা তা পরীক্ষা করে দেখুন?


101

আমার যাচাই করা উচিত justPrices[i].substr(commapos+2,1)

স্ট্রিংটি এমন কিছু: "ব্লেবলা, 120"

এই ক্ষেত্রে এটি '0' একটি সংখ্যা কিনা তা যাচাই করবে। কিভাবে এই কাজ করা যেতে পারে?



1
@ cctan এটি কোনও সদৃশ নয়। এই প্রশ্নটি একটি স্ট্রিং যাচাই করা সম্পর্কে, এটি একটি চরিত্র পরীক্ষা করার বিষয়ে।
জ্যাকোকনর

উত্তর:


67

তুলনা অপারেটরগুলি এটি অঙ্কের অক্ষরের সীমার মধ্যে রয়েছে কিনা তা দেখতে ব্যবহার করতে পারেন:

var c = justPrices[i].substr(commapos+2,1);
if (c >= '0' && c <= '9') {
    // it is a number
} else {
    // it isn't
}

1
আমিও এটি নিয়ে এসেছি। কেন কেউ এটি ব্যবহার করছে না, এবং এর পরিবর্তে জটিল তুলনা করছে? এটি কিছু ক্ষেত্রে কাজ করবে না?
ব্যবহারকারী 826955

43

আপনি হয় ব্যবহার করতে পারেন parseInt এবং চেক চেয়েisNaN

অথবা আপনি যদি আপনার স্ট্রিংয়ে সরাসরি কাজ করতে চান তবে আপনি এই জাতীয় পুনর্নির্মাণটি ব্যবহার করতে পারেন:

function is_numeric(str){
    return /^\d+$/.test(str);
}

4
বা এমনকি সহজ যদি আমাদের কেবল একটি একক অক্ষর পরীক্ষা করতে হয়:function is_numeric_char(c) { return /\d/.test(c); }
জ্যাকোকনর

1
@ জ্যাকোকনার আপনার পরীক্ষাটি কেবলমাত্র চর (উদাহরণস্বরূপ is_numeric_char("foo1bar") == true) এর চেয়ে বেশি স্ট্রিংগুলির জন্য সত্য ঘটবে । আপনি যদি একটি সংখ্যার চরটি পরীক্ষা করতে চান /^\d$/.test(c)তবে এটি আরও ভাল সমাধান হতে পারে। তবে যাইহোক, এটি প্রশ্ন ছিল না :)
ইয়ারন ইউ

24

সম্পাদনা: ব্লেন্ডারের আপডেট হওয়া উত্তরটি এখানে সঠিক উত্তর যদি আপনি কেবল একটি একক অক্ষর পরীক্ষা করে থাকেন (যথা: ly !isNaN(parseInt(c, 10)) ) । আপনি যদি পুরো স্ট্রিং পরীক্ষা করতে চান তবে নীচের আমার উত্তরটি একটি ভাল সমাধান।

এখানে jQuery এর isNumericবাস্তবায়ন (খাঁটি জাভাস্ক্রিপ্টে) রয়েছে, যা সম্পূর্ণ স্ট্রিংয়ের বিরুদ্ধে কাজ করে :

function isNumeric(s) {
    return !isNaN(s - parseFloat(s));
}

এই ফাংশনটির জন্য মন্তব্যটি পড়ে:

// parseFloat NaNs সাংখ্যিক-নিক্ষিপ্ত মিথ্যা ধনাত্মক (নাল | সত্য | মিথ্যা | "")
// ... তবে শীর্ষস্থানীয় সংখ্যাগুলির স্ট্রিংগুলি, বিশেষত হেক্স
আক্ষরিক ("0x ...") এর বিয়োগফল ব্যাখ্যা করে // বিয়োগফলগুলি এনএএন-তে অসম্পূর্ণতা জোর করে

আমি মনে করি আমরা বিশ্বাস করতে পারি যে এই চ্যাপগুলি এতে বেশ কিছুটা সময় ব্যয় করেছে!

মন্তব্য উত্স এখানে । সুপার জিক এখানে আলোচনা ।


2
এটি কাজ করে তবে এটি কেবলমাত্র ডিজিট-চেকের জন্য ওভারকিল (এটি বহু-সংখ্যা সংখ্যার সাথে কাজ করে)। আমার সমাধানটি এতটা পরিষ্কার নাও হতে পারে তবে এটির চেয়ে অনেক দ্রুত।
ব্যবহারকারী 2486570

18

আমি ভাবছি কেন কেউ এর মতো সমাধান পোস্ট করেন নি:

var charCodeZero = "0".charCodeAt(0);
var charCodeNine = "9".charCodeAt(0);

function isDigitCode(n) {
   return(n >= charCodeZero && n <= charCodeNine);
}

অনুরোধ সহ:

if (isDigitCode(justPrices[i].charCodeAt(commapos+2))) {
    ... // digit
} else {
    ... // not a digit
}

ঠিক সেই ধরণের সমাধানের জন্য অনুসন্ধান করেছিলেন - ty
ম্যাথিয়াস হার্মান

প্যারামিটারটি সরবরাহ না করা হলে 0 চার্ট কোডের জন্য 0 প্যারামিটার মানটি ফেলে দিতে পারেন।
ডেভ ডি জং

16

আপনি এটি ব্যবহার করতে পারেন:

function isDigit(n) {
    return Boolean([true, true, true, true, true, true, true, true, true, true][n]);
}

এখানে, আমি এটি গ্রহণযোগ্য পদ্ধতির সাথে তুলনা করেছি: http://jsperf.com/isdigittest/5 । আমি খুব একটা আশা করিনি, তাই আমি বেশ অবাক হয়েছিলাম, যখন আমি জানতে পারলাম যে গ্রহণযোগ্য পদ্ধতিটি খুব ধীর ছিল।

মজার বিষয় হ'ল, গ্রহণযোগ্য পদ্ধতিটি দ্রুত সঠিক ইনপুট (উদা। '5') এবং ভুলের জন্য ধীর (যেমন, 'এ'), আমার পদ্ধতিটি সম্পূর্ণ বিপরীত (ভুলটির জন্য দ্রুত এবং সঠিকটির জন্য ধীর)।

তবুও, সবচেয়ে খারাপ ক্ষেত্রে, আমার পদ্ধতিটি সঠিক ইনপুটটির জন্য গৃহীত সমাধানের চেয়ে 2 গুণ বেশি এবং ভুল ইনপুটটির জন্য 5 গুণ বেশি দ্রুত।


5
আমি এই উত্তর ভালবাসি! হতে পারে এটি অনুকূল করে নিন: !!([!0, !0, !0, !0, !0, !0, !0, !0, !0, !0][n]);এতে দুর্দান্ত ডাব্লুটিএফ সম্ভাবনা রয়েছে এবং এটি বেশ ভালভাবে কাজ করে (ব্যর্থ হয় 007)।
জোনাথন


7
এই 'সমাধান' অনুসারে "length"(এবং অ্যারেগুলিতে পাওয়া অন্যান্য বৈশিষ্ট্যগুলি) অঙ্কগুলি: পি
শ্যাডো

12

আমি মনে করি এটি সমাধানের উপায়গুলি নিয়ে আসা খুব মজাদার। নীচে কিছু।
(নীচের সমস্ত ফাংশন ধরে নিলে যুক্তি একটি একক অক্ষর to এ পরিবর্তন করুনn[0] enforce এটি প্রয়োগে )

পদ্ধতি 1:

function isCharDigit(n){
  return !!n.trim() && n > -1;
}

পদ্ধতি 2:

function isCharDigit(n){
  return !!n.trim() && n*0==0;
}

পদ্ধতি 3:

function isCharDigit(n){
  return !!n.trim() && !!Number(n+.1); // "+.1' to make it work with "." and "0" Chars
}

পদ্ধতি 4:

var isCharDigit = (function(){
  var a = [1,1,1,1,1,1,1,1,1,1];
  return function(n){
    return !!a[n] // check if `a` Array has anything in index 'n'. Cast result to boolean
  }
})();

পদ্ধতি 5:

function isCharDigit(n){
  return !!n.trim() && !isNaN(+n);
}

পরীক্ষার স্ট্রিং:

var str = ' 90ABcd#?:.+', char;
for( char of str ) 
  console.log( char, isCharDigit(char) );

পদ্ধতি 1, 2, 3 এবং 5 এর trueজন্য আউটপুট " "
ব্যবহারকারী 247702

মজা করার জন্য আমি এগুলির একটি জাসস্পিফ করেছি, তারপরে একটি charCodeAt()তুলনা যুক্ত করেছি - যা প্রায় 4x দ্রুত ছিল - jsperf.com/isdigit3
রাইকোশেট

@ রিচোকেট - ভাল। ASCII কোডের পরিসরটি সত্যই পরীক্ষার সর্বোত্তম উপায় ..
vsync


5

আপনি যদি একক অক্ষর পরীক্ষা করে থাকেন তবে:

var isDigit = (function() {
    var re = /^\d$/;
    return function(c) {
        return re.test(c);
    }
}());

সিটি ডিজিট কিনা তা নির্ভর করে সত্য বা মিথ্যা ফিরে আসবে।


4

আমি একটি সহজ রেজেক্স পরামর্শ দিচ্ছি।

আপনি যদি স্ট্রিংয়ে কেবল শেষ চরিত্রের সন্ধান করেন:

/^.*?[0-9]$/.test("blabla,120");  // true
/^.*?[0-9]$/.test("blabla,120a"); // false
/^.*?[0-9]$/.test("120");         // true
/^.*?[0-9]$/.test(120);           // true
/^.*?[0-9]$/.test(undefined);     // false
/^.*?[0-9]$/.test(-1);            // true
/^.*?[0-9]$/.test("-1");          // true
/^.*?[0-9]$/.test(false);         // false
/^.*?[0-9]$/.test(true);          // false

আপনি যদি কেবল একটি ইনপুট হিসাবে একটি একক চর পরীক্ষা করে থাকেন তবে রেজেক্স আরও সহজ:

var char = "0";
/^[0-9]$/.test(char);             // true

4

সবচেয়ে সংক্ষিপ্ত সমাধানটি হ'ল:

const isCharDigit = n => n < 10;

আপনি এগুলি প্রয়োগ করতে পারেন:

const isCharDigit = n => Boolean(++n);

const isCharDigit = n => '/' < n && n < ':';

const isCharDigit = n => !!++n;

আপনি যদি 1 টিরও বেশি চ্যাট্যাকার পরীক্ষা করতে চান তবে আপনি পরবর্তী রূপগুলি ব্যবহার করতে পারেন

নিয়মিত প্রকাশ:

const isDigit = n => /\d+/.test(n);

তুলনা:

const isDigit = n => +n == n;

এটি NAN না কিনা তা পরীক্ষা করুন

const isDigit = n => !isNaN(n);

3
var Is = {
    character: {
        number: (function() {
            // Only computed once
            var zero = "0".charCodeAt(0), nine = "9".charCodeAt(0);

            return function(c) {
                return (c = c.charCodeAt(0)) >= zero && c <= nine;
            }
        })()
    }
};

1
isNumber = function(obj, strict) {
    var strict = strict === true ? true : false;
    if (strict) {
        return !isNaN(obj) && obj instanceof Number ? true : false;
    } else {
        return !isNaN(obj - parseFloat(obj));
    }
}

কঠোর মোড ছাড়াই আউটপুট:

var num = 14;
var textnum = '14';
var text = 'yo';
var nan = NaN;

isNumber(num);
isNumber(textnum);
isNumber(text);
isNumber(nan);

true
true
false
false

কঠোর মোড সহ আউটপুট:

var num = 14;
var textnum = '14';
var text = 'yo';
var nan = NaN;

isNumber(num, true);
isNumber(textnum, true);
isNumber(text, true);
isNumber(nan);

true
false
false
false

1

চেষ্টা করুন:

function is_numeric(str){
        try {
           return isFinite(str)
        }
        catch(err) {
            return false
        }
    }

0

এটি কাজ করে বলে মনে হচ্ছে:

স্ট্যাটিক বাঁধাই:

String.isNumeric = function (value) {
    return !isNaN(String(value) * 1);
};

প্রোটোটাইপ বাইন্ডিং:

String.prototype.isNumeric = function () {
    return !isNaN(this.valueOf() * 1);
};

এটি একক অক্ষরগুলির পাশাপাশি পুরো স্ট্রিংগুলি সংখ্যাসূচক কিনা তা পরীক্ষা করবে।




0

আপনি এটি চেষ্টা করতে পারেন (আমার ক্ষেত্রে কাজ করেছেন)

যদি আপনি পরীক্ষা করতে চান যে কোনও স্ট্রিংয়ের প্রথম চরটি কোনও আন্ত:

if (parseInt(YOUR_STRING.slice(0, 1))) {
    alert("first char is int")
} else {
    alert("first char is not int")
}

আপনি যদি পরীক্ষা করতে চান তবে চরটি কোনও আন্ত:

if (parseInt(YOUR_CHAR)) {
    alert("first char is int")
} else {
    alert("first char is not int")
}

0

এই ফাংশনটি আমি খুঁজে পেতে পারি এমন সমস্ত পরীক্ষার ক্ষেত্রে কাজ করে। এটি এর চেয়েও দ্রুত:

function isNumeric (n) {
  if (!isNaN(parseFloat(n)) && isFinite(n) && !hasLeading0s(n)) {
    return true;
  }
  var _n = +n;
  return _n === Infinity || _n === -Infinity;
}

var isIntegerTest = /^\d+$/;
var isDigitArray = [!0, !0, !0, !0, !0, !0, !0, !0, !0, !0];

function hasLeading0s(s) {
  return !(typeof s !== 'string' ||
    s.length < 2 ||
    s[0] !== '0' ||
    !isDigitArray[s[1]] ||
    isIntegerTest.test(s));
}
var isWhiteSpaceTest = /\s/;

function fIsNaN(n) {
  return !(n <= 0) && !(n > 0);
}

function isNumber(s) {
  var t = typeof s;
  if (t === 'number') {
    return (s <= 0) || (s > 0);
  } else if (t === 'string') {
    var n = +s;
    return !(fIsNaN(n) || hasLeading0s(s) || !(n !== 0 || !(s === '' || isWhiteSpaceTest.test(s))));
  } else if (t === 'object') {
    return !(!(s instanceof Number) || fIsNaN(+s));
  }
  return false;
}

function testRunner(IsNumeric) {
  var total = 0;
  var passed = 0;
  var failedTests = [];

  function test(value, result) {
    total++;
    if (IsNumeric(value) === result) {
      passed++;
    } else {
      failedTests.push({
        value: value,
        expected: result
      });
    }
  }
  // true
  test(0, true);
  test(1, true);
  test(-1, true);
  test(Infinity, true);
  test('Infinity', true);
  test(-Infinity, true);
  test('-Infinity', true);
  test(1.1, true);
  test(-0.12e-34, true);
  test(8e5, true);
  test('1', true);
  test('0', true);
  test('-1', true);
  test('1.1', true);
  test('11.112', true);
  test('.1', true);
  test('.12e34', true);
  test('-.12e34', true);
  test('.12e-34', true);
  test('-.12e-34', true);
  test('8e5', true);
  test('0x89f', true);
  test('00', true);
  test('01', true);
  test('10', true);
  test('0e1', true);
  test('0e01', true);
  test('.0', true);
  test('0.', true);
  test('.0e1', true);
  test('0.e1', true);
  test('0.e00', true);
  test('0xf', true);
  test('0Xf', true);
  test(Date.now(), true);
  test(new Number(0), true);
  test(new Number(1e3), true);
  test(new Number(0.1234), true);
  test(new Number(Infinity), true);
  test(new Number(-Infinity), true);
  // false
  test('', false);
  test(' ', false);
  test(false, false);
  test('false', false);
  test(true, false);
  test('true', false);
  test('99,999', false);
  test('#abcdef', false);
  test('1.2.3', false);
  test('blah', false);
  test('\t\t', false);
  test('\n\r', false);
  test('\r', false);
  test(NaN, false);
  test('NaN', false);
  test(null, false);
  test('null', false);
  test(new Date(), false);
  test({}, false);
  test([], false);
  test(new Int8Array(), false);
  test(new Uint8Array(), false);
  test(new Uint8ClampedArray(), false);
  test(new Int16Array(), false);
  test(new Uint16Array(), false);
  test(new Int32Array(), false);
  test(new Uint32Array(), false);
  test(new BigInt64Array(), false);
  test(new BigUint64Array(), false);
  test(new Float32Array(), false);
  test(new Float64Array(), false);
  test('.e0', false);
  test('.', false);
  test('00e1', false);
  test('01e1', false);
  test('00.0', false);
  test('01.05', false);
  test('00x0', false);
  test(new Number(NaN), false);
  test(new Number('abc'), false);
  console.log('Passed ' + passed + ' of ' + total + ' tests.');
  if (failedTests.length > 0) console.log({
    failedTests: failedTests
  });
}
testRunner(isNumber)


আমি '0' কেস ঠিক করে দিয়েছি।
c7x43t

0

যতদূর আমি জানি, সবচেয়ে সহজ উপায়টি কেবলমাত্র দ্বারা গুন করা 1:

var character = ... ; // your character
var isDigit = ! isNaN(character * 1);

একের দ্বারা গুণিত কোনও সংখ্যক স্ট্রিং থেকে একটি সংখ্যা তৈরি করে (যেমন আপনার কেবল একটি অক্ষর এটি সর্বদা 0 থেকে 9 এর মধ্যে পূর্ণসংখ্যার হবে) এবং NaNঅন্য কোনও স্ট্রিংয়ের জন্য একটি ।


0

উপরের উত্তরগুলির মতো একটি, আমি ব্যবহার করেছি

 var sum = 0; //some value
 let num = parseInt(val); //or just Number.parseInt
 if(!isNaN(num)) {
     sum += num;
 }

জাভাস্ক্রিপ্ট | তে কোনও স্ট্রিং সংখ্যাসূচক হলে এই ব্লগপোস্ট এই চেকটিতে আরও কিছু আলোকপাত করবে টাইপস্ক্রিপ্ট এবং ES6


0

ভাষার গতিশীল ধরণের পরীক্ষার উপকারের মাধ্যমে একটি সহজ সমাধান:

function isNumber (string) {
   //it has whitespace
   if(string === ' '.repeat(string.length)){
     return false
   }
   return string - 0 === string * 1
}

নীচে পরীক্ষা কেস দেখুন


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