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;
}
user3509546
fuente
Posible duplicado de TypeScript que convierte una cadena en un número
Wesley Coetzee

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
C Snover
fuente
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 !");
}
Richard Lee
fuente
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())));
}
Gil Epshtain
fuente
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.

ene
fuente
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, () => {}]
RTW
fuente
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!

James Paterson
fuente
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)) { ... }

Felix
fuente
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).

basarat
fuente
11
Es una preocupación suficiente marcarlo como un error, como para sugerir que no es correcto.
Jane Panda