चेक करें कि क्या चरित्र संख्या है?


102

मुझे यह जाँचने की आवश्यकता है कि क्या justPrices[i].substr(commapos+2,1)

स्ट्रिंग कुछ इस तरह है: "ब्लाब्ला, 120"

इस मामले में यह जाँच करेगा कि क्या '0' एक संख्या है। यह कैसे किया जा सकता है?



1
@cctan यह कोई डुप्लिकेट नहीं है। यह प्रश्न एक स्ट्रिंग की जाँच करने के बारे में है, यह एक चरित्र की जाँच के बारे में है।
जैकोक्रेन

जवाबों:


68

आप तुलना संचालकों का उपयोग यह देखने के लिए कर सकते हैं कि यह अंक वर्णों की सीमा में है:

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

1
मैं भी इसके साथ आ गया। कोई भी इसका उपयोग क्यों नहीं कर रहा है, और इसके बजाय जटिल तुलनाएं कर रहा है? क्या यह कुछ मामलों में काम नहीं करेगा?
user826955

43

आप या तो उपयोग कर सकते हैं parseIntऔर के साथ की जाँच करेंisNaN

या यदि आप सीधे अपने स्ट्रिंग पर काम करना चाहते हैं तो आप इस तरह से रीजैक्स का उपयोग कर सकते हैं:

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

4
या और भी सरल अगर हमें केवल एक ही पात्र की जाँच करनी है:function is_numeric_char(c) { return /\d/.test(c); }
जैकोक्रान

1
@jackocnr आपका परीक्षण स्ट्रिंग्स के लिए भी सही लौटेगा जिसमें सिर्फ एक चार (जैसे is_numeric_char("foo1bar") == true) से अधिक है। यदि आप एक संख्यात्मक चार के लिए जाँच करना चाहते /^\d$/.test(c)हैं एक बेहतर समाधान होगा। लेकिन वैसे भी, यह सवाल नहीं था :)
यारॉन यू।

24

संपादित करें: यदि आप सिर्फ एक चरित्र (अर्थात् !isNaN(parseInt(c, 10))) की जाँच कर रहे हैं तो ब्लेंडर का अद्यतन उत्तर यहां सही उत्तर है । यदि आप पूरे तार का परीक्षण करना चाहते हैं तो मेरा उत्तर नीचे एक अच्छा समाधान है।

यहाँ jQuery का isNumericकार्यान्वयन (शुद्ध जावास्क्रिप्ट में) है, जो पूर्ण स्ट्रिंग्स के खिलाफ काम करता है :

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

इस समारोह के लिए टिप्पणी पढ़ता है:

// parseFloat NaNs न्यूमेरिक-कास्ट झूठी सकारात्मक (null | सच | गलत | "")
// ... लेकिन अग्रणी संख्याओं की गलत व्याख्या करता है, विशेष रूप से हेक्स शाब्दिक ("0x ...")
// घटाव NaN को बल देता है।

मुझे लगता है कि हम भरोसा कर सकते हैं कि इन चैप्स ने इस पर काफी समय बिताया है!

यहाँ टिप्पणी की गई । सुपर गीक चर्चा यहाँ


2
यह काम करता है, लेकिन यह केवल अंकों की जांच के लिए एक ओवरकिल है (यह बहु अंकों की संख्या के साथ काम करता है)। मेरा समाधान उतना स्पष्ट नहीं हो सकता है, लेकिन इससे बहुत तेज है।
user2486570

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
Matthias Herrmann

आप charCodeAt के लिए 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)।
जोनाथन

@ जोनाथन - मेरा जवाब , विधि # 4
vsync

7
इस 'समाधान' के अनुसार, "length"(और सरणियों पर पाए जाने वाले अन्य गुण) अंक हैं: P
शैडो

12

मुझे लगता है कि इसे हल करने के तरीकों के साथ आना बहुत मजेदार है। नीचे कुछ हैं।
(नीचे सभी कार्यों मान तर्क एक भी चरित्र है। को बदलें n[0]यह लागू करने के लिए)

विधि 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के लिए " "
user247702

मज़े के लिए मैंने इनमें से एक jsperf किया, फिर एक charCodeAt()तुलना जोड़ी - जो लगभग 4x तेज थी - jsperf.com/isdigit3
Rycochet

@ रिसायोच - अच्छा। 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

आप यह कोशिश कर सकते हैं (मेरे मामले में काम किया)

यदि आप परीक्षण करना चाहते हैं कि क्या स्ट्रिंग का पहला चार्ट एक int है:

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 21

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
}

नीचे परीक्षण के मामले देखें


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.