文字が数字かどうかを確認しますか?


101

かどうかを確認する必要がありjustPrices[i].substr(commapos+2,1)ます。

文字列は「blabla、120」のようなものです。

この場合、「0」が数値かどうかをチェックします。これはどのように行うことができますか?



1
@cctan重複ではありません。その質問は文字列をチェックすることであり、これは文字をチェックすることです。
jackocnr 2018年

回答:


67

比較演算子を使用して、数字の範囲内にあるかどうかを確認できます。

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); }
jackocnr

1
@jackocnrテストでは、文字以外のもの(たとえばis_numeric_char("foo1bar") == true)を含む文字列に対してもtrueが返されます。数値文字を確認/^\d$/.test(c)する場合は、より良い解決策です。とにかく、それは問題ではありませんでした:)
Yaron U.

24

編集:ブレンダーの更新された答えは、あなたが単一の文字(つまり、 !isNaN(parseInt(c, 10)))。以下の私の答えは、文字列全体をテストする場合の良い解決策です。

次にisNumeric完全な文字列に対して機能するjQueryの実装(純粋なJavaScript)を示します

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

この関数のコメントは次のとおりです。

// parseFloat NaNs numeric-cast false positives(null | true | false | "")
// ...しかし、先行数値文字列、特に16進リテラル( "0x ...")を誤って解釈します
//減算は無限大をNaNに強制します

これらの問題がこれにかなりの時間を費やしたと私たちは信じられると思います!

ここにコメント付きのソース。ここでスーパーオタクの議論。


2
これは機能しますが、数字のみのチェックには過剰です(複数桁の番号で機能します)。私の解決策はそれほど明確ではないかもしれませんが、これよりはるかに高速です。
user2486570 14

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

パラメータが指定されていない場合は0が暗黙指定されるため、charCodeAtの0パラメータ値を削除できます。
Dave de Jong

16

あなたはこれを使うことができます:

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

ここで、私はそれを受け入れられた方法と比較しました: http //jsperf.com/isdigittest/5。私はあまり期待していなかったので、受け入れられた方法がはるかに遅いことを知ったとき、私はかなり驚きました。

興味深いことに、受け入れられたメソッドは正しい入力が速く(例: '5')、正しくない場合は遅くなります(例: 'a')、私の方法は正反対です(正しくない場合は速く、正しい場合は遅くなります)。

それでも、最悪の場合、私の方法は、正しい入力の場合は受け入れられているソリューションより2倍速く、誤った入力の場合は5倍以上速くなります。


5
私はこの答えが大好きです!多分それを最適化します:!!([!0, !0, !0, !0, !0, !0, !0, !0, !0, !0][n]);それは素晴らしいWTFの可能性があり、非常にうまく機能します(の失敗007)。
ジョナサン

@ジョナサン-私の答え、方法#4をご覧ください
vsync '30年

7
この「解決策」によると"length"(および配列にある他の属性)は数字です:P
Shadow

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()比較を追加しました-ほぼ4倍高速でした-jsperf.com/isdigit3
Rycochet

@Rycochet-良いもの。ASCIIコードは..本当にテストするための最良の方法である範囲
VSYNC


5

単一の文字をテストする場合は、次のようにします。

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

cが数字かどうかに応じて、trueまたはfalseを返します。


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;

複数のチャット文字をチェックしたい場合は、次のバリアントを使用できます

正規表現:

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")
}

charが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);

1を乗算すると、任意の数値文字列から数値が作成され(1文字しかないため、常に0から9の整数になります)、NaNその他の文字列に対してはになります。



0

言語の動的型チェックを利用することによる簡単な解決策:

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

以下のテストケースを参照してください


-1

使うだけ isFinite

const number = "1";
if (isFinite(number)) {
    // do something
}

これは、スペース ""に対してtrueを返します
Michael Bray
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.