Cette fonction vérifie si l'entrée est numérique au sens classique du terme, comme on s'attend à ce qu'une fonction normale de détection de nombres fonctionne.
C'est un test que l'on peut utiliser pour la saisie de formulaires HTML, par exemple.
Il permet de contourner tout le folklore JS, comme tipeof(NaN) = nombre, parseint('1 Kg') = 1, les booléens transformés en nombres, etc.
Il le fait en rendant l'argument comme une chaîne et en vérifiant cette chaîne contre une regex comme celles de @codename- mais en permettant des entrées comme 5. et .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' ));
Explication de la regex :
/^-?(\d+\.?\d*)$|(\d*\.?\d+)$/
Le "^" initial et le "$" final correspondent au début et à la fin de la chaîne de caractères, afin de garantir que la vérification couvre l'ensemble de la chaîne. La partie "- ?" est le signe moins avec le multiplicateur " ?" qui permet d'en avoir zéro ou une instance.
Ensuite, il y a deux groupes similaires, délimités par des parenthèses. La chaîne doit correspondre à l'un ou l'autre de ces groupes. Le premier correspond à des nombres comme 5. et le second à .5.
Le premier groupe est
\d+\.?\d*
Le " \d +" correspond à un chiffre ( \d ) une ou plusieurs fois.
Le " \. ?" est le point décimal (échappé avec "\" pour le priver de sa magie), zéro ou une fois.
La dernière partie " \d *" est à nouveau un chiffre, zéro ou plusieurs fois.
Toutes les parties sont facultatives, sauf le premier chiffre, ce qui fait que ce groupe correspond à des nombres comme 5. et non .5, qui correspond à l'autre moitié.
3 votes
Selon W3schools, ^ ne nie les séquences que lorsque à l'intérieur de la parenthèse, donc [^0-9] se réfère aux non-chiffres, mais ^[0-9] indique "début de ligne".