此功能检查它的输入是否是传统意义上的数字,因为人们期望正常数字检测功能起作用 .
例如,这是一个可以用于HTML表单输入的测试 .
它绕过了所有的JS民间传说,比如tipeof(NaN)= number,parseint('1 Kg')= 1,booleans强制数字等等 .
它是通过将参数呈现为字符串并将该字符串与@codename-那样的正则表达式进行检查来实现的,但允许使用类似于5.和.5的条目
function isANumber( n ) {
var numStr = /^-?(\d+\.?\d*)$|(\d*\.?\d+)$/;
return numStr.test( n.toString() );
}
not numeric:
Logger.log( 'isANumber( "aaa" ): ' + isANumber( 'aaa' ) );
Logger.log( 'isANumber( "" ): ' + isANumber( '' ) );
Logger.log( 'isANumber( "lkjh" ): ' + isANumber( 'lkjh' ) );
Logger.log( 'isANumber( 0/0 ): ' + isANumber( 0 / 0 ) );
Logger.log( 'isANumber( 1/0 ): ' + isANumber( 1 / 0 ) );
Logger.log( 'isANumber( "1Kg" ): ' + isANumber( '1Kg' ) );
Logger.log( 'isANumber( "1 Kg" ): ' + isANumber( '1 Kg' ) );
Logger.log( 'isANumber( false ): ' + isANumber( false ) );
Logger.log( 'isANumber( true ): ' + isANumber( true ) );
numeric:
Logger.log( 'isANumber( "0" ): ' + isANumber( '0' ) );
Logger.log( 'isANumber( "12.5" ): ' + isANumber( '12.5' ) );
Logger.log( 'isANumber( ".5" ): ' + isANumber( '.5' ) );
Logger.log( 'isANumber( "5." ): ' + isANumber( '5.' ) );
Logger.log( 'isANumber( "-5" ): ' + isANumber( '-5' ) );
Logger.log( 'isANumber( "-5." ): ' + isANumber( '-5.' ) );
Logger.log( 'isANumber( "-.5" ): ' + isANumber( '-5.' ) );
Logger.log( 'isANumber( "1234567890" ): ' + isANumber( '1234567890' ));
正则表达式的解释:
/^-?(\d+\.?\d*)$|(\d*\.?\d+)$/
最初的“^”和最后的“$”匹配字符串的开头和结尾,以确保检查跨越整个字符串 . “ - ?”部分是带“?”的减号允许零或一个实例的乘数 .
然后有两个相似的组,用括号分隔 . 该字符串必须与这些组中的任何一个匹配 . 第一个匹配数字,如5.和第二个.5
第一组是
\d+\.?\d*
"\d+"匹配一个数字(\ d)一次或多次 .
".?"是小数点(使用""进行转义以避免其魔法),零或一次 .
最后一部分"\d*"再次是一个数字,零次或多次 .
所有部分都是可选的,但是第一个数字,所以这个组匹配的数字像5.而不是.5,它们与另一半相匹配 .