In Typescript, How to check if a string is Numeric

Typescript

Typescript Problem Overview


In Typescript, this shows an error saying isNaN accepts only numeric values

isNaN('9BX46B6A')

and this returns false because parseFloat('9BX46B6A') evaluates to 9

isNaN(parseFloat('9BX46B6A'))

I can still run with the error showing up in Visual Studio, but I would like to do it the right way.

Currently, I have written this modified function -

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

Typescript Solutions


Solution 1 - Typescript

The way to convert a string to a number is with Number, not parseFloat.

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

You can also use the unary plus operator if you like shorthand:

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

Be careful when checking against NaN (the operator === and !== don't work as expected with NaN). Use:

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

Solution 2 - Typescript

Update 2

This method is no longer available in rxjs v6

I'm solved it by using the isNumeric operator from rxjs library (importing rxjs/util/isNumeric

Update

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

. . .

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

Solution 3 - Typescript

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

Solution 4 - Typescript

You can use the Number.isFinite() function:

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

Note: there's a significant difference between the global function isFinite() and the latter Number.isFinite(). In the case of the former, string coercion is performed - so isFinite('0') === true whilst Number.isFinite('0') === false.

Also, note that this is not available in IE!

Solution 5 - Typescript

Simple answer: (watch for blank & null)

isNaN(+'111') = false;
isNaN(+'111r') = true;
isNaN(+'r') = true;
isNaN(+'') = false;   
isNaN(null) = false;   

https://codepen.io/CQCoder/pen/zYGEjxd?editors=1111

Solution 6 - Typescript

My simple solution here is:

const isNumeric = (val: string) : boolean => {
   return !isNaN(Number(val));
}

// isNumberic("2") => true
// isNumeric("hi") => false;

Solution 7 - Typescript

I would choose an existing and already tested solution. For example this from rxjs in typescript:

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

Without rxjs isArray() function and with simplefied typings:

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

You should always test such functions with your use cases. If you have special value types, this function may not be your solution. You can test the function here.

Results are:

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

As you can see, you have to be careful, if you use this function with enums.

Solution 8 - Typescript

Considering that your variable could be string or number or any type - for full numbers (non-floats) in Angular/Typescript you can use:

var isFullNumber: boolean = 
    Number.isInteger(Number(yourVariable)) && yourVariable !== null;

Edited as pointed out by @tarrbal - we CANNOT use just:

Number.isInteger(yourVariable);

To prove check out these 3 tests:

let testVariables = [0, 1, "0", "1", "A", {}, -3, 0.1, NaN, null, undefined]; 

let isFullNumber: boolean;
let ix: number = 1;
testVariables.forEach(v => {
isFullNumber = Number.isInteger(v);							// <---
console.log(ix++, ': ', v, isFullNumber);
})

console.log('--------------');

ix = 1;
testVariables.forEach(v => {
isFullNumber = Number.isInteger(Number(v));					// <---
console.log(ix++, ': ', v, isFullNumber);
})

console.log('--------------');
ix = 1;
testVariables.forEach(v => {
isFullNumber = Number.isInteger(Number(v)) && v !== null;  	// <---
console.log(ix++, ': ', v, isFullNumber);
})

and these 3 results:

1	:		0			true
2	:		1			true
3	:		0			false <- would expect true
4	:		1			false <- would expect true
5	:		A			false
6	:		{}			false
7	:		-3			true
8	:		0.1			false
9	:		NaN			false
10	:		null		false
11	:		undefined	false
----------------------------
1	:		0			true
2	:		1			true
3	:		0			true
4	:		1			true
5	:		A			false
6	:		{}			false
7	:		-3			true
8	:		0.1			false
9	:		NaN			false
10	:		null		true <- would expect false
11	:		undefined	false
----------------------------
1	:		0			true
2	:		1			true
3	:		0			true
4	:		1			true
5	:		A			false
6	:		{}			false
7	:		-3			true
8	:		0.1			false
9	:		NaN			false
10	:		null		false
11	:		undefined	false

Solution 9 - Typescript

Scrolled through each answer and was surprised that this simple one-liner wasn't presented yet:

const isNumber = (val: string | number) => !!(val || val === 0) && !isNaN(Number(val.toString()));

Solution 10 - Typescript

Most of the time the value that we want to check is string or number, so here is function that i use:

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

Codesandbox tests.

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, () => {}]

Solution 11 - Typescript

My solution:

 function isNumeric(val: unknown): val is string | number {
  return (
    !isNaN(Number(Number.parseFloat(String(val)))) &&
    isFinite(Number(val))
  );
}
// true
isNumeric("-10");
isNumeric("0");
isNumeric("0xff");
isNumeric("0xFF");
isNumeric("8e5");
isNumeric("3.1415");
isNumeric("+10");
isNumeric("144");
isNumeric("5");

// false
isNumeric("-0x42");
isNumeric("7.2acdgs");
isNumeric("");
isNumeric({});
isNumeric(NaN);
isNumeric(null);
isNumeric(true);
isNumeric(Infinity);
isNumeric(undefined);
isNumeric([]);
isNumeric("some string");

Solution 12 - Typescript

 const isNumeric = (value: string): boolean =>
  !new RegExp(/[^\d]/g).test(value.trim());

If you want to allow decimal point

   const isNumeric = (value: string): boolean =>
      !new RegExp(/[^\d.]/g).test(value.trim());

Solution 13 - Typescript

if var sum=0; var x;

then, what about this? sum+=(x|0);

Solution 14 - Typescript

Whether a string can be parsed as a number is a runtime concern. Typescript does not support this use case as it is focused on compile time (not runtime) safety.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser3509546View Question on Stackoverflow
Solution 1 - TypescriptC SnoverView Answer on Stackoverflow
Solution 2 - TypescriptRichard LeeView Answer on Stackoverflow
Solution 3 - TypescriptGil EpshtainView Answer on Stackoverflow
Solution 4 - TypescriptJames PatersonView Answer on Stackoverflow
Solution 5 - TypescriptNick HView Answer on Stackoverflow
Solution 6 - TypescriptHung VuView Answer on Stackoverflow
Solution 7 - TypescriptJanView Answer on Stackoverflow
Solution 8 - TypescriptFelixView Answer on Stackoverflow
Solution 9 - TypescriptLCIIIView Answer on Stackoverflow
Solution 10 - TypescriptZiiMakcView Answer on Stackoverflow
Solution 11 - TypescriptKrzysztof GrzybekView Answer on Stackoverflow
Solution 12 - Typescriptmbarish-meView Answer on Stackoverflow
Solution 13 - TypescriptMir Mohamed UllahView Answer on Stackoverflow
Solution 14 - TypescriptbasaratView Answer on Stackoverflow