Periksa apakah karakter adalah angka?


102

Saya perlu memeriksa apakah justPrices[i].substr(commapos+2,1).

Stringnya kira-kira seperti: "blabla, 120"

Dalam hal ini akan memeriksa apakah '0' adalah angka. Bagaimana ini bisa dilakukan?


1
kemungkinan duplikat ke sini
cctan

1
@cctan Ini bukan duplikat. Pertanyaan itu tentang memeriksa string, ini tentang memeriksa karakter.
jackocnr

Jawaban:


68

Anda dapat menggunakan operator perbandingan untuk melihat apakah itu dalam kisaran karakter digit:

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

1
Saya juga datang dengan ini. Mengapa tidak ada yang menggunakannya, dan malah membuat perbandingan yang rumit? Apakah ini tidak akan berhasil dalam beberapa kasus?
pengguna826955

43

Anda dapat menggunakan parseIntdan memeriksaisNaN

atau jika Anda ingin bekerja secara langsung pada string Anda, Anda dapat menggunakan regexp seperti ini:

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

4
Atau bahkan lebih sederhana lagi jika kita hanya perlu memeriksa satu karakter:function is_numeric_char(c) { return /\d/.test(c); }
jackocnr

1
@jackocnr pengujian Anda juga akan mengembalikan nilai true untuk string yang berisi lebih dari sekadar karakter (mis is_numeric_char("foo1bar") == true.). jika Anda ingin memeriksa karakter numerik /^\d$/.test(c)akan menjadi solusi yang lebih baik. tapi bagaimanapun, itu bukan pertanyaannya :)
Yaron U.

24

EDIT: Jawaban terbaru Blender adalah jawaban yang benar di sini jika Anda hanya memeriksa satu karakter (yaitu !isNaN(parseInt(c, 10))). Jawaban saya di bawah ini adalah solusi yang baik jika Anda ingin menguji seluruh string.

Berikut adalah isNumericimplementasi jQuery (dalam JavaScript murni), yang bekerja dengan string penuh :

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

Komentar untuk fungsi ini berbunyi:

// parseFloat NaNs numeric-cast false positives (null | true | false | "")
// ... tetapi salah mengartikan string angka-terdepan, terutama hex literal ("0x ...")
// pengurangan memaksa infinitas ke NaN

Saya pikir kita bisa percaya bahwa orang-orang ini telah menghabiskan cukup banyak waktu untuk ini!

Sumber berkomentar di sini . Diskusi super geek di sini .


2
Ini berfungsi, tetapi itu berlebihan untuk pemeriksaan hanya digit (berfungsi dengan angka multi-digit). Solusi saya mungkin tidak sejelas, tetapi jauh lebih cepat dari ini.
pengguna2486570

18

Saya bertanya-tanya mengapa tidak ada yang memposting solusi seperti:

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

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

dengan doa seperti:

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

menelusuri solusi semacam itu dengan tepat - ty
Matthias Herrmann

Anda dapat menghapus nilai parameter 0 untuk charCodeAt karena 0 tersirat ketika parameter tidak disediakan.
Dave de Jong

16

Anda dapat menggunakan ini:

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

Di sini, saya membandingkannya dengan metode yang diterima: http://jsperf.com/isdigittest/5 . Saya tidak berharap banyak, jadi saya cukup terkejut, ketika saya menemukan bahwa metode yang diterima jauh lebih lambat.

Hal yang menarik adalah, meskipun metode yang diterima adalah input yang benar lebih cepat (mis. '5') dan lebih lambat untuk yang salah (mis. 'A'), metode saya justru sebaliknya (cepat untuk yang salah dan lebih lambat untuk yang benar).

Namun, dalam kasus terburuk, metode saya 2 kali lebih cepat daripada solusi yang diterima untuk masukan yang benar dan lebih dari 5 kali lebih cepat untuk masukan yang salah.


5
Saya suka jawaban ini! Mungkin mengoptimalkannya untuk: !!([!0, !0, !0, !0, !0, !0, !0, !0, !0, !0][n]);Ini memiliki potensi WTF yang besar dan bekerja dengan cukup baik (gagal 007).
Jonathan

@ Jonathan - lihat jawaban saya , metode # 4
vsync

7
Menurut 'solusi' ini, "length"(dan atribut lain yang ditemukan pada array) adalah digit: P
Shadow

12

Saya pikir sangat menyenangkan menemukan cara untuk menyelesaikan ini. Berikut ini beberapa.
(Semua fungsi di bawah ini menganggap argumen adalah satu karakter. Ubah ke n[0]untuk memaksakannya)

Metode 1:

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

Metode 2:

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

Metode 3:

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

Metode 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
  }
})();

Metode 5:

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

String uji:

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

Metode 1, 2, 3 dan 5 keluaran trueuntuk " ".
pengguna247702

Untuk bersenang-senang, saya melakukan jsperf ini, lalu menambahkan charCodeAt()perbandingan - yang hampir 4x lebih cepat - jsperf.com/isdigit3
Rycochet

@Rycochet - bagus. Rentang kode ASCII benar-benar adalah cara terbaik untuk menguji ..
vsync


5

Jika Anda menguji karakter tunggal, maka:

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

akan mengembalikan true atau false tergantung pada apakah c adalah digit atau bukan.


4

Saya menyarankan regex sederhana.

Jika Anda hanya mencari karakter terakhir dalam string:

/^.*?[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

Dan regex bahkan lebih sederhana jika Anda hanya memeriksa satu karakter sebagai masukan:

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

4

Solusi terpendek adalah:

const isCharDigit = n => n < 10;

Anda juga dapat menerapkan ini:

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

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

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

jika Anda ingin memeriksa lebih dari 1 karakter, Anda dapat menggunakan varian berikutnya

Ekspresi Reguler:

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

Perbandingan:

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

Periksa apakah bukan 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));
    }
}

keluaran tanpa mode ketat:

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

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

true
true
false
false

keluaran dengan mode ketat:

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

Mencoba:

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

0

Ini sepertinya berhasil:

Pengikatan statis:

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

Pengikatan prototipe:

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

Ini akan memeriksa karakter tunggal, serta seluruh string untuk melihat apakah mereka numerik.


0
square = function(a) {
    if ((a * 0) == 0) {
        return a*a;
    } else {
        return "Enter a valid number.";
    }
}

Sumber


0
function is_numeric(mixed_var) {
    return (typeof(mixed_var) === 'number' || typeof(mixed_var) === 'string') &&
        mixed_var !== '' && !isNaN(mixed_var);
}

Kode sumber


0

Anda dapat mencoba ini (berhasil dalam kasus saya)

Jika Anda ingin menguji apakah karakter pertama dari sebuah string adalah int:

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

Jika Anda ingin menguji apakah char adalah int:

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

0

Fungsi ini berfungsi untuk semua kasus uji yang dapat saya temukan. Ini juga lebih cepat dari:

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)


Saya memperbaiki kasus '0'.
c7x43t

0

Sejauh yang saya tahu, cara termudah adalah dengan mengalikannya dengan 1:

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

Perkalian dengan satu membuat angka dari string numerik apa pun (karena Anda hanya memiliki satu karakter, itu akan selalu berupa bilangan bulat dari 0 hingga 9) dan NaNuntuk string lainnya.



0

Solusi sederhana dengan memanfaatkan pemeriksaan tipe dinamis bahasa:

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

lihat kasus uji di bawah


-1

Gunakan saja isFinite

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

Ini mengembalikan true untuk spasi ""
Michael Bray
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.