在Typescript中,这将显示一个错误,表示isNaN只接受数值
isNaN('9BX46B6A')
返回false,因为parseFloat('9BX46B6A')的值为9
isNaN(parseFloat('9BX46B6A'))
我仍然可以运行的错误显示在Visual Studio,但我想做的正确的方式。
目前,我已经写了这个修改后的函数-
static isNaNModified = (inputStr: string) => {
var numericRepr = parseFloat(inputStr);
return isNaN(numericRepr) || numericRepr.toString().length != inputStr.length;
}
这是我信赖的isNumber函数。明智地使用它
function isNumber(numStr: string) {
return !isNaN(parseFloat(numStr)) && !isNaN(+numStr)
}
测试
it("test valid isNumber", () => {
expect(isNumber("0")).toEqual(true)
expect(isNumber("-1")).toEqual(true)
})
it("test invalid isNumber", () => {
expect(isNumber('" 1000 "')).toEqual(false)
expect(isNumber('" 100,00.00 "')).toEqual(false)
expect(isNumber("100,00.00")).toEqual(false)
expect(isNumber("")).toEqual(false)
expect(isNumber(null as any as string)).toEqual(false)
expect(isNumber("abc")).toEqual(false)
expect(isNumber("10%")).toEqual(false)
expect(isNumber("#10")).toEqual(false)
expect(isNumber("2^10")).toEqual(false)
expect(isNumber("2!")).toEqual(false)
expect(isNumber("(10)")).toEqual(false)
expect(isNumber("10px")).toEqual(false)
})
将字符串转换为数字的方法是使用number,而不是parseFloat。
Number('1234') // 1234
Number('9BX9') // NaN
如果你喜欢速记,你也可以使用一元加号运算符:
+'1234' // 1234
+'9BX9' // NaN
检查NaN时要小心(运算符===和!==不能像NaN那样工作)。使用:
isNaN(+maybeNumber) // returns true if NaN, otherwise false
我会选择一个现有的和已经测试过的解决方案。例如,typescript中的rxjs:
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
没有rxjs的isArray()函数,只有简化的类型:
function isNumeric(val: any): boolean {
return !(val instanceof Array) && (val - parseFloat(val) + 1) >= 0;
}
您应该总是用您的用例来测试这些函数。如果您有特殊的值类型,这个函数可能不是您的解决方案。
你可以在这里测试这个函数。
结果是:
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
如您所见,如果您将此函数用于枚举,则必须非常小心。