En Typecript, Cómo verificar si una cadena es Numérica


184

En Typecript, esto muestra un error que dice que isNaN solo acepta valores numéricos

isNaN('9BX46B6A')

y esto devuelve falso porque se parseFloat('9BX46B6A')evalúa como9

isNaN(parseFloat('9BX46B6A'))

Todavía puedo ejecutar con el error que aparece en Visual Studio, pero me gustaría hacerlo de la manera correcta.

Actualmente, he escrito esta función modificada:

static isNaNModified = (inputStr: string) => {
    var numericRepr = parseFloat(inputStr);
    return isNaN(numericRepr) || numericRepr.toString().length != inputStr.length;
}

Respuestas:


338

La forma de convertir una cadena en un número es con Number, no parseFloat.

Number('1234') // 1234
Number('9BX9') // NaN

También puede usar el operador unario plus si le gusta la taquigrafía:

+'1234' // 1234
+'9BX9' // NaN

Tenga cuidado al verificar contra NaN (el operador ===y !==no trabaje como se esperaba NaN). Utilizar:

 isNaN(maybeNumber) // returns true if NaN, otherwise false

18
¿eso significa que hacer esto: if (isNaN (+ possibleNumberString)) es una forma válida de verificar?
— Mathijs Segers

55
¿Por qué usarías Numberarriba parseInto parseFloat? Number('')da 0 mientras parseInt('')da, NaNque está más en línea con lo que espero.
— Didii

66
Como se mencionó en la pregunta original , parseInt('9BX9')(y parseFloat('9BX9')) volverá 9, no NaN. Si no desea la conversión de una cadena vacía a 0, primero compruebe explícitamente la cadena vacía.
— C Snover

1
Si desea verificarlo, use en isNaN(Number(what_ever))lugar de Number(what_ever) === Nan.
— k0pernikus

3
@sauntimo Numberno es una cosa TypeScript, es una función de constructor EcmaScript incorporada que acepta un valor y devuelve un número primitivo cuando se llama como una función en lugar de un constructor.
— C Snover

46

Actualización 2

Este método ya no está disponible en rxjs v6

Estoy resuelto mediante el uso de la isNumeric operador de rxjs biblioteca (importación rxjs / util / isNumeric

Actualizar

import { isNumeric } from 'rxjs/util/isNumeric';

. . .

var val = "5700";
if (isNumeric(val)){
   alert("it is number !");
}

55
Este método ya no está disponible en rxjs v6.
— Logic01

35
function isNumber(value: string | number): boolean
{
   return ((value != null) &&
           (value !== '') &&
           !isNaN(Number(value.toString())));
}


3

Elegiría una solución existente y ya probada. Por ejemplo, esto de rxjs en mecanografiado:

function isNumeric(val: any): val is number | string {
  // parseFloat NaNs numeric-cast false positives (null|true|false|"")
  // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
  // subtraction forces infinities to NaN
  // adding 1 corrects loss of precision from parseFloat (#15100)
  return !isArray(val) && (val - parseFloat(val) + 1) >= 0;
}

rxjs / isNumeric.ts

Sin la función rxjs isArray () y con tipificaciones simples:

function isNumeric(val: any): boolean {
  return !(val instanceof Array) && (val - parseFloat(val) + 1) >= 0;
}

Siempre debe probar tales funciones con sus casos de uso. Si tiene tipos de valores especiales, esta función puede no ser su solución. Puedes probar la función aquí.

Los resultados son:

enum         : CardTypes.Debit   : true
decimal      : 10                : true
hexaDecimal  : 0xf10b            : true
binary       : 0b110100          : true
octal        : 0o410             : true
stringNumber : '10'              : true

string       : 'Hello'           : false
undefined    : undefined         : false
null         : null              : false
function     : () => {}          : false
array        : [80, 85, 75]      : false
turple       : ['Kunal', 2018]   : false
object       : {}                : false

Como puede ver, debe tener cuidado si usa esta función con enumeraciones.


1

La mayoría de las veces el valor que queremos verificar es una cadena o un número, así que aquí está la función que uso:

const isNumber = (n: string | number): boolean => 
    !isNaN(parseFloat(String(n))) && isFinite(Number(n));

Pruebas de códigos y cajas .

const willBeTrue = [0.1, '1', '-1', 1, -1, 0, -0, '0', "-0", 2e2, 1e23, 1.1, -0.1, '0.1', '2e2', '1e23', '-0.1', ' 898', '080']

const willBeFalse = ['9BX46B6A', "+''", '', '-0,1', [], '123a', 'a', 'NaN', 1e10000, undefined, null, NaN, Infinity, () => {}]

1

Puedes usar la Number.isFinite()función:

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false
Number.isFinite('0');       // false
Number.isFinite(null);      // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

Nota: hay una diferencia significativa entre la función global isFinite()y la última Number.isFinite(). En el caso de los primeros, se realiza la coerción de cuerdas, isFinite('0') === truemientras que mientras Number.isFinite('0') === false.

Además, tenga en cuenta que esto no está disponible en IE!


Pero ... TS2345: El argumento del tipo '"1"' no se puede asignar al parámetro del tipo 'número'. Debe ser Number.isFinite (Number ('0'));
— Mcgri

0

Para números completos (no flotantes) en Angular puede usar:

if (Number.isInteger(yourVariable)) { ... }


1
Number.isIntegersolo te dice si yourVariable, que ya es un numbertipo, es un número entero. No funciona con cuerdas. Entonces, Number.isInteger(Number(yourVariable))podría hacer el truco.
— tarrball

-2

Si una cadena se puede analizar como un número es una cuestión de tiempo de ejecución. TypeScript no admite este caso de uso, ya que se centra en la seguridad del tiempo de compilación (no en tiempo de ejecución).


11
Es una preocupación suficiente marcarlo como un error, como para sugerir que no es correcto.
— Jane Panda
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.