Verifique se o personagem é um número?

101

Eu preciso verificar se justPrices[i].substr(commapos+2,1).

A string é algo como: "blabla, 120"

Nesse caso, ele verificaria se '0' é um número. Como isso pode ser feito?

Lisovaccaro
fonte
1
possível duplicado até aqui
cctan de
1
@cctan Não é uma duplicata. Essa questão é sobre como verificar uma string, é sobre como verificar um caractere.
jackocnr
Possível duplicata de Validar números decimais em JavaScript - IsNumeric ()
Stephan Weinhold

Respostas:

67

Você pode usar operadores de comparação para ver se está no intervalo de caracteres de dígitos:

var c = justPrices[i].substr(commapos+2,1);
if (c >= '0' && c <= '9') {
    // it is a number
} else {
    // it isn't
}
GregL
fonte
1
Eu também inventei isso. Por que ninguém o está usando e, em vez disso, está fazendo comparações complicadas? Isso não funcionará em alguns casos?
user826955,
43

você pode usar parseInte verificar comisNaN

ou se você quiser trabalhar diretamente em sua string, você pode usar regexp desta forma:

function is_numeric(str){
    return /^\d+$/.test(str);
}
Yaron U.
fonte
4
Ou ainda mais simples se precisarmos verificar apenas um único caractere:function is_numeric_char(c) { return /\d/.test(c); }
jackocnr 01 de
1
@jackocnr seu teste também retornará verdadeiro para strings que contenham mais do que apenas um caractere (por exemplo is_numeric_char("foo1bar") == true). se você quiser verificar um caracter numérico /^\d$/.test(c)seria uma solução melhor. mas de qualquer forma, não era a questão :)
Yaron U.
24

EDITAR: A resposta atualizada do Blender é a resposta certa aqui se você estiver apenas verificando um único caractere (a saber !isNaN(parseInt(c, 10))). Minha resposta abaixo é uma boa solução se você quiser testar strings inteiras.

Aqui está a isNumericimplementação do jQuery (em JavaScript puro), que funciona com strings completas :

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

O comentário para esta função é:

// parseFloat NaNs numeric-cast falsos positivos (null | true | false | "")
// ... mas interpreta erroneamente strings de números iniciais, particularmente literais hexadecimais ("0x ...")
// subtração força infinitos a NaN

Acho que podemos confiar que esses caras gastaram um bom tempo nisso!

Fonte comentada aqui . Discussão super geek aqui .

jackocnr
fonte
2
Isso funciona, mas é um exagero para a verificação apenas de dígitos (funciona com números de vários dígitos). Minha solução pode não ser tão clara, mas é muito mais rápida do que isso.
user2486570
18

Eu me pergunto por que ninguém postou uma solução como:

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

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

com uma invocação como:

if (isDigitCode(justPrices[i].charCodeAt(commapos+2))) {
    ... // digit
} else {
    ... // not a digit
}
Mariana
fonte
procurou exatamente esse tipo de solução - ty
Matthias Herrmann
Você pode descartar o valor do parâmetro 0 para charCodeAt, pois 0 está implícito quando o parâmetro não é fornecido.
Dave de Jong
16

Você pode usar isto:

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

Aqui, eu comparei com o método aceito: http://jsperf.com/isdigittest/5 . Eu não esperava muito, então fiquei bastante surpreso quando descobri que o método aceito era muito mais lento.

O interessante é que, embora o método aceito seja a entrada correta mais rápida (por exemplo, '5') e mais lento para incorreto (por exemplo, 'a'), meu método é exatamente o oposto (rápido para incorreto e mais lento para correto).

Ainda assim, no pior caso, meu método é 2 vezes mais rápido do que a solução aceita para entrada correta e 5 vezes mais rápido para entrada incorreta.

user2486570
fonte
5
Eu amo essa resposta! Talvez otimizá-lo para: !!([!0, !0, !0, !0, !0, !0, !0, !0, !0, !0][n]);Tem grande potencial de WTF e funciona muito bem (falha para 007).
Jonathan,
@ Jonathan - veja minha resposta , método # 4
vsync
7
De acordo com esta 'solução', "length"(e outros atributos encontrados em matrizes) são dígitos: P
Shadow
12

Acho muito divertido descobrir maneiras de resolver isso. Abaixo estão alguns.
(Todas as funções abaixo presumem que o argumento é um único caractere. Mude para n[0]para aplicá-lo)

Método 1:

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

Método 2:

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

Método 3:

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

Método 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
  }
})();

Método 5:

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

String de teste:

var str = ' 90ABcd#?:.+', char;
for( char of str ) 
  console.log( char, isCharDigit(char) );
vsync
fonte
Métodos 1, 2, 3 e 5 resultam truepara " ".
user247702
Para me divertir, fiz um jsperf desses e adicionei uma charCodeAt()comparação - que foi quase 4x mais rápida - jsperf.com/isdigit3
Rycochet
@Rycochet - boa. O intervalo de códigos ASCII é realmente a melhor maneira de testar.
vsync
10

Função simples

function isCharNumber(c){
    return c >= '0' && c <= '9';
}
João Pimentel Ferreira
fonte
5

Se você estiver testando caracteres únicos, então:

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

retornará verdadeiro ou falso dependendo se c é um dígito ou não.

RobG
fonte
4

Eu sugiro um regex simples.

Se você estiver procurando apenas o último caractere da 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

E a regex é ainda mais simples se você estiver apenas verificando um único caractere como entrada:

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

A solução mais curta é:

const isCharDigit = n => n < 10;

Você também pode aplicar estes:

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

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

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

se você quiser verificar mais de 1 chatacter, você pode usar as próximas variantes

Expressão regular:

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

Comparação:

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

Verifique se não é NaN

const isDigit = n => !isNaN(n);
Vladyslav Beziazychenko
fonte
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;
            }
        })()
    }
};
mmm
fonte
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));
    }
}

saída sem modo estrito:

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

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

true
true
false
false

saída com modo estrito:

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
Banindo Stuckey
fonte
1

Experimentar:

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

Isso parece funcionar:

Ligação estática:

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

Ligação de protótipo:

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

Ele verificará caracteres únicos, bem como strings inteiras, para ver se são numéricos.

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

Fonte

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

Código fonte

Alexander Serkin
fonte
0

Você pode tentar isso (funcionou no meu caso)

Se você quiser testar se o primeiro caractere de uma string é um int:

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

Se você quiser testar se o char é um int:

if (parseInt(YOUR_CHAR)) {
    alert("first char is int")
} else {
    alert("first char is not int")
}
TheOne LuKcian
fonte
0

Esta função funciona para todos os casos de teste que pude encontrar. Também é mais rápido do que:

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
fonte
Consertei o caso '0'.
c7x43t
0

Pelo que eu sei, a maneira mais fácil é simplesmente multiplicar por 1:

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

A multiplicação por um cria um número de qualquer string numérica (como você tem apenas um caractere, será sempre um número inteiro de 0 a 9) e um NaNpara qualquer outra string.

1234ru
fonte
0

Uma solução simples, aproveitando a verificação de tipo dinâmica da linguagem:

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

veja os casos de teste abaixo

Leonardo
fonte
-1

Apenas use isFinite

const number = "1";
if (isFinite(number)) {
    // do something
}
Gibolt
fonte
Isso retorna verdadeiro para um espaço ""
Michael Bray