2011-03-06 7 views
2

J'exécute certaines fonctions pour vérifier que le texte saisi par l'utilisateur dans un formulaire contient au moins un chiffre et une lettre. Cela ne semble pas fonctionner. Étant donné que les deux fonctions sont presque identiques, je vais poster un d'entre eux:La validation 'Check for Letter' ne fonctionne pas

function hasALetter(textField){ 
    //returns true or false based on whether or not the text field has at least one letter inside it  
    console.log("Checking for letters..."); 

    var hasLetter = false; 

    for(var i=0, checkLength=textField.length; i<checkLength; i++){ 
     var letter = textField.substr(i,1); 
     console.log("letter = " + letter); 
     if(isNan(letter) == false){ 
      hasLetter = false; 
     } 
    } 
    if(hasLetter == true){ 
     return true; 
    } 
} 

Le journal (« lettre = » + lettre) montre jamais dans ma console. Il me manque probablement quelque chose de stupide, mais cela ne semble pas aller jusqu'au bout de la fonction.

Pour référence, voici comment j'appelle les fonctions:

if(pwd.value.length > 9){ 

      var pwdLetter = hasALetter(pwd); 
      var pwdNumber = hasADigit(pwd); 

      if(pwdLetter==true){ 
       if(pwdNumber==true){ 

Oui, je suis conscient qu'il est très salissant, mais je suis encore à apprendre. Je suis sûr qu'il y a des façons plus avancées/plus propres de faire cette validation, mais pour les besoins de ma scolarité, je le fais comme ça pour l'instant.

+1

OMG, que se passe-t-il ici? 1) Obtenir un seul caractère avec 'substr' 2) isNa * N * 3) if (true) return vrai sinon return false est inutile 4) log après l'instruction return. Cela peut être fait beaucoup de * * mieux ... – Harmen

+0

@Harmen> Je suis sûr qu'il peut, mais depuis que je suis toujours dans ma première classe Javascript de mon programme collégial, « substr » est ce que le prof nous a donné au travail avec. En outre, je pensais que j'avais retiré les déclarations «retour faux». : P – GnomeSlice

+0

@GnomeSlice: textField.charAt (i) renvoie une lettre à cette position; 'return hasLetter' devrait être meilleur, pas de condition statement;) ... – Maxym

Répondre

4

La meilleure façon de vérifier si une chaîne a une lettre est l'expression régulière:

function hasLetter(str){ 
    // check for characters between a and z 
    // i flag makes it case insensitive 
    return /[a-z]/i.test(str); 
} 

Si vous voulez boucle à travers la chaîne et que vous souhaitez également utiliser la fonction isNaN, ce serait faire:

function hasLetter(str){ 

    // loop through every character 
    for(var i=0; i<str.length; i++){ 

    // check if the i-th character is not a number 
    if(isNaN(str[i])){ 

     // if so, return true 
     return true; 
    } 
    } 

    // if the loop has finished and no letters have been found, return false 
    return false; 
} 

Mais je ne recommanderais pas cette méthode, car isNaN contrôles wh Le premier argument est un nombre ou non. Tout d'abord, tous les caractères qui ne sont pas des chiffres ne sont pas des lettres. Deuxièmement, l'argument que vous passez est une chaîne (str[i] renvoie un caractère de type chaîne, même s'il s'agit d'un chiffre)

+0

Cela ne finira-t-il pas toujours par retourner faux une fois la boucle terminée? – GnomeSlice

+0

@Harmen: str [i] ne fonctionnera pas dans IE, 'str.charAt (i)' est la façon standard et crossbrowser de le faire. Par exemple. 'asd' [1] dans FF et Chrome retournera 's', mais IE retournera 'indéfini'. Soyez prudent ... – Maxym

+1

@GnomeSlice: si la boucle est terminée, il n'y a pas de lettre; alors oui ça va retourner faux. Sinon, il retournera vrai et quittera cette fonction de l'intérieur de la boucle – Maxym

4

Il est « isNaN », pas « isNan » ... ... aussi, si elle est pas un certain nombre, cela ne signifie pas nécessairement que ce n'est pas une lettre; en fait la logique semble en arrière, ou à l'envers.

Si "isNaN" renvoie true, ce n'est pas un nombre. Est-ce une lettre? Eh bien, vous devez vérifier. Si "isNaN" renvoie false, alors tout ce que vous savez c'est que c'est l'un des caractères "0" à "9".

L'ensemble est beaucoup mieux fait avec une expression régulière, mais si cela est devoirs il se peut que cette approche ne peut pas être utilisée. Vous pouvez vérifier si un caractère est une lettre avec quelque chose comme:

function isLetter(c) { 
    c = c.toUpperCase(); 
    return c >= "A" && c <= "Z"; 
} 
+0

Mon groupe n'a rien appris au-delà de ça maintenant. Je pensais que la logique semblait un peu folle, mais c'est ce que je dois travailler avec pour l'instant. Vous avez raison à propos de la faute de frappe, mais la corriger n'a fait aucune différence. – GnomeSlice

0

Je voudrais utiliser des expressions régulières, voici quelques fonctions rapides.

function hasALetter(text) 
    { 
     var regex = new RegExp("[a-zA-Z]"); 
     if(text.match(regex)) 
      return true; 
     else 
      return false; 
    } 

    function hasANumber(text) 
    { 
     var regex = new RegExp("[0-9]"); 
     if(text.match(regex)) 
      return true; 
     else 
      return false; 
    } 
+1

Pourquoi utilisez-vous les conditions? pourquoi ne pas écrire simple 'return text.match (regex);' au lieu?? – Maxym

+0

J'ai essayé cela en premier et pour une raison quelconque, il a retourné le premier caractère correspondant. –

+0

Je ne sais pas si c'est un navigateur spécifique, mais quand la chaîne ne correspond pas à regexp, alors FF retourne 'null', donc oui, pour retourner la valeur booléenne mieux écrire 'return (text.match (regex)! = Null); ' – Maxym