Проверить, является ли символ числом?

104

Мне нужно проверить justPrices[i].substr(commapos+2,1).

Строка выглядит примерно так: «blabla, 120».

В этом случае он проверит, является ли «0» числом. Как это может быть сделано?

Lisovaccaro
источник
1
возможный дубликат здесь
cctan
1
@cctan Это не дубликат. Этот вопрос касается проверки строки, это проверки символа.
jackocnr
Возможный дубликат проверки десятичных чисел в JavaScript - IsNumeric ()
Стефан Вайнхольд

Ответы:

69

Вы можете использовать операторы сравнения, чтобы увидеть, находится ли он в диапазоне цифровых символов:

var c = justPrices[i].substr(commapos+2,1);
if (c >= '0' && c <= '9') {
    // it is a number
} else {
    // it isn't
}
GregL
источник
1
Я тоже это придумал. Почему никто не использует его, а вместо этого проводит сложные сравнения? В некоторых случаях это не сработает?
user826955
44

вы можете использовать parseInt а затем проверить с помощьюisNaN

или если вы хотите работать непосредственно со своей строкой, вы можете использовать регулярное выражение следующим образом:

function is_numeric(str){
    return /^\d+$/.test(str);
}
Ярон У.
источник
4
Или еще проще, если нам нужно проверить только один символ:function is_numeric_char(c) { return /\d/.test(c); }
jackocnr 01
1
@jackocnr ваш тест также вернет true для строк, содержащих больше, чем просто символ (например, is_numeric_char("foo1bar") == true). если вы хотите проверить числовой символ, /^\d$/.test(c)было бы лучшим решением. но в любом случае, это был не вопрос :)
Ярон У.
24

EDIT: обновленный ответ Blender - правильный ответ, если вы просто проверяете один символ (а именно !isNaN(parseInt(c, 10)) ). Мой ответ ниже - хорошее решение, если вы хотите протестировать целые строки.

Вот isNumericреализация jQuery (на чистом JavaScript), которая работает с полными строками :

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

Комментарий к этой функции гласит:

// parseFloat NaNs числовое приведение ложных срабатываний (null | true | false | "")
// ... но неверно интерпретирует строки с ведущими числами, особенно шестнадцатеричные литералы ("0x ...")
// вычитание приводит к бесконечности до NaN

Думаю, можно верить, что эти ребята потратили на это немало времени!

Комментируемый источник здесь . Обсуждение супер компьютерщиков здесь .

jackocnr
источник
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
Маттиас Херрманн
Вы можете опустить значение параметра 0 для charCodeAt, поскольку 0 подразумевается, когда параметр не указан.
Дэйв де Йонг,
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 раз для неправильного ввода.

user2486570
источник
5
Мне нравится этот ответ! Возможно, оптимизировать его до следующего: !!([!0, !0, !0, !0, !0, !0, !0, !0, !0, !0][n]);он имеет большой потенциал WTF и работает достаточно хорошо (не работает 007).
Джонатан
@Jonathan - см. Мой ответ , метод №4
vsync
7
Согласно этому "length"
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) );
vsync
источник
Методы 1, 2, 3 и 5 вывода trueдля " ".
user247702
Ради интереса я сделал jsperf из них, затем добавил charCodeAt()сравнение - которое было почти в 4 раза быстрее - jsperf.com/isdigit3
Rycochet 01
@Rycochet - молодец. Диапазон кодов ASCII действительно лучший способ проверить ..
vsync 01
10

Простая функция

function isCharNumber(c){
    return c >= '0' && c <= '9';
}
Жоао Пиментел Феррейра
источник
5

Если вы тестируете одиночные символы, то:

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

вернет истину или ложь в зависимости от того, является ли 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
zenslug
источник
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
        }
    }
Вдохновение
источник
1

Простое решение за счет использования динамической проверки типов языка:

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

см. тестовые примеры ниже

Леонардо
источник
0

Кажется, это работает:

Статическая привязка:

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

Привязка прототипа:

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

Он будет проверять отдельные символы, а также целые строки, чтобы узнать, являются ли они числовыми.

Мэтью Лейтон
источник
0
function is_numeric(mixed_var) {
    return (typeof(mixed_var) === 'number' || typeof(mixed_var) === 'string') &&
        mixed_var !== '' && !isNaN(mixed_var);
}

Исходный код

Александр Серкин
источник
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")
}
TheOne LuKcian
источник
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)

c7x43t
источник
Я исправил случай «0».
c7x43t 09
0

Насколько мне известно, проще всего умножить на 1:

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

Умножение на единицу делает число из любой числовой строки (поскольку у вас есть только один символ, он всегда будет целым числом от 0 до 9) и a NaNдля любой другой строки.

1234ru
источник
-1

Просто используйте isFinite

const number = "1";
if (isFinite(number)) {
    // do something
}
Гибольт
источник
Это верно для пространства ""
Майкл Брей,