Les fonctions JS sont effectivement parfois un peu surprenantes
Ça ne serait pas une meilleure solution d’écrire « à la main » une fonction pour faire le test en étant sûr du comportement ? C’est assez simple, pour chaque caractère il faut vérifier qu’il ne se trouve pas dans le range '0'
à '9'
. Si l’un des caractères ne passe pas le test, alors la chaîne ne représente pas un entier, on peut retourner true
(n’est pas un entier) de façon anticipée. Si toutes les itérations ont eu lieu et qu’on sort de la boucle, alors c’est que tous les caractères étaient bien dans le range '0'
à '9'
, autrement dit, ça désigne bien un entier : on retourne alors false
.
Pour comparer les ranges, tu peux utiliser String.charCodeAt()
comme cela :
> '0'.charCodeAt()
48
> '9'.charCodeAt()
57
Le test est donc de savoir, pour chaque caractère c
, si son code (c.charCodeAt()
) est bien dans l’intervalle inclusif : [48, 57]
. Autrement dit, c
est un chiffre si c.charCodeAt()
est supérieur ou égal à 48 et qu’il est inférieur ou égal à 57.
Le plus simple est de le voir comme ça (équivalent) : c
n’est pas un chiffre si son code est strictement inférieur à 48, ou si son code est strictement supérieur à 57 :
if (c.charCodeAt() < 48 || c.charCodeAt() > 57)
return true;
Tu aurais donc un machin comme ça (pas testé) :
function isNotInteger(cs) {
for (let c of cs) {
let code = c.charCodeAt();
if (code < 48 || code > 57)
return true;
}
return false;
}