¿Compruebe si el carácter es un número?

102

Necesito comprobar si justPrices[i].substr(commapos+2,1).

La cadena es algo como: "blabla, 120"

En este caso, verificaría si '0' es un número. ¿Cómo se puede hacer esto?

lisovaccaro
fuente
1
posible duplicado hasta aquí
cctan
1
@cctan No es un duplicado. Esa pregunta se trata de verificar una cadena, se trata de verificar un carácter.
jackocnr
Posible duplicado de Validar números decimales en JavaScript - IsNumeric ()
Stephan Weinhold

Respuestas:

68

Puede usar operadores de comparación para ver si está en el rango 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
fuente
1
También se me ocurrió esto. ¿Por qué nadie lo usa y, en cambio, hace comparaciones complicadas? ¿No funcionará esto en algunos casos?
user826955
43

puede usar parseInty luego consultar conisNaN

o si desea trabajar directamente en su cadena, puede usar regexp como este:

function is_numeric(str){
    return /^\d+$/.test(str);
}
Yaron U.
fuente
4
O incluso más simple si solo necesitamos marcar un solo carácter:function is_numeric_char(c) { return /\d/.test(c); }
jackocnr
1
@jackocnr su prueba también devolverá verdadero para cadenas que contengan más de un carácter (por ejemplo is_numeric_char("foo1bar") == true). si desea buscar un carácter numérico /^\d$/.test(c), sería una mejor solución. pero de todos modos, no era la pregunta :)
Yaron U.4 de
24

EDITAR: La respuesta actualizada de Blender es la respuesta correcta aquí si solo está verificando un solo carácter (es decir !isNaN(parseInt(c, 10))). Mi respuesta a continuación es una buena solución si desea probar cadenas completas.

Aquí está la isNumericimplementación de jQuery (en JavaScript puro), que funciona con cadenas completas :

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

El comentario de esta función dice:

// parseFloat NaNs falsos positivos de conversión numérica (nulo | verdadero | falso | "")
// ... pero malinterpreta las cadenas de números iniciales, particularmente los literales hexadecimales ("0x ...")
// la resta fuerza los infinitos a NaN

¡Creo que podemos confiar en que estos muchachos han dedicado bastante tiempo a esto!

Fuente comentada aquí . Discusión súper geek aquí .

jackocnr
fuente
2
Esto funciona, pero es excesivo para la verificación de solo dígitos (funciona con números de varios dígitos). Puede que mi solución no sea tan clara, pero es mucho más rápida que esto.
user2486570
18

Me pregunto por qué nadie ha publicado una solución como:

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

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

con una invocación como:

if (isDigitCode(justPrices[i].charCodeAt(commapos+2))) {
    ... // digit
} else {
    ... // not a digit
}
Mariana
fuente
busqué exactamente ese tipo de solución - ty
Matthias Herrmann
Puede eliminar el valor del parámetro 0 para charCodeAt ya que 0 está implícito cuando no se proporciona el parámetro.
Dave de Jong
16

Puedes usar esto:

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

Aquí, lo comparé con el método aceptado: http://jsperf.com/isdigittest/5 . No esperaba mucho, así que me sorprendió bastante cuando descubrí que el método aceptado era mucho más lento.

Lo interesante es que, si bien el método aceptado es una entrada correcta más rápida (por ejemplo, '5') y más lento para incorrecto (por ejemplo, 'a'), mi método es exactamente lo contrario (rápido para incorrecto y más lento para correcto).

Aún así, en el peor de los casos, mi método es 2 veces más rápido que la solución aceptada para la entrada correcta y más de 5 veces más rápido para la entrada incorrecta.

usuario2486570
fuente
5
¡Amo esta respuesta! Quizás optimizarlo para: !!([!0, !0, !0, !0, !0, !0, !0, !0, !0, !0][n]);Tiene un gran potencial de WTF y funciona bastante bien (falla 007).
Jonathan
@Jonathan - vea mi respuesta , método n. ° 4
vsync
7
De acuerdo con esta 'solución', "length"(y otros atributos que se encuentran en las matrices) son dígitos: P
Sombra
12

Creo que es muy divertido encontrar formas de resolver esto. A continuación se muestran algunos.
(Todas las funciones siguientes asumen que el argumento es un solo carácter. Cambie a n[0]para aplicarlo)

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

Cadena de prueba:

var str = ' 90ABcd#?:.+', char;
for( char of str ) 
  console.log( char, isCharDigit(char) );
vsync
fuente
Salida truede los métodos 1, 2, 3 y 5 para " ".
user247702
Para divertirme, hice un jsperf de estos, luego agregué una charCodeAt()comparación, que fue casi 4 veces más rápida, jsperf.com/isdigit3
Rycochet
@Rycochet - bueno. El rango de códigos ASCII es realmente la mejor manera de probar ..
vsync
10

Función simple

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

Si está probando caracteres individuales, entonces:

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

devolverá verdadero o falso dependiendo de si c es un dígito o no.

RobG
fuente
4

Sugiero una expresión regular simple.

Si está buscando solo el último carácter de la cadena:

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

Y la expresión regular es aún más simple si solo está verificando un solo carácter como entrada:

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

La solución más corta es:

const isCharDigit = n => n < 10;

También puede aplicar estos:

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

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

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

si desea verificar más de 1 personaje, puede usar las siguientes variantes

Expresión regular:

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

Comparación:

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

Comprueba si no es NaN

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

salida sin modo estricto:

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

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

true
true
false
false

salida con modo estricto:

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
Prohibición de Stuckey
fuente
1

Tratar:

function is_numeric(str){
        try {
           return isFinite(str)
        }
        catch(err) {
            return false
        }
    }
En sp
fuente
0

Esto parece funcionar:

Enlace estático:

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

Encuadernación de prototipos:

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

Verificará caracteres individuales, así como cadenas completas para ver si son numéricos.

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

Fuente

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

Código fuente

Alexander Serkin
fuente
0

Puedes probar esto (funcionó en mi caso)

Si desea probar si el primer carácter de una cadena es un int:

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

Si desea probar si el carácter es un int:

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

Esta función funciona para todos los casos de prueba que pude encontrar. También es más rápido 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
fuente
Arreglé el caso '0'.
c7x43t
0

Hasta donde yo sé, la forma más fácil es simplemente multiplicar por 1:

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

La multiplicación por uno genera un número de cualquier cadena numérica (como solo tiene un carácter, siempre será un número entero de 0 a 9) y un NaNpara cualquier otra cadena.

1234ru
fuente
0

Una solución simple al aprovechar la verificación dinámica de tipos del lenguaje:

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

ver casos de prueba a continuación

Leonardo
fuente
-1

Solo usa isFinite

const number = "1";
if (isFinite(number)) {
    // do something
}
Gibolt
fuente
Esto devuelve verdadero para un espacio ""
Michael Bray