Author: bpoussin Date: 2011-08-19 20:56:55 +0200 (Fri, 19 Aug 2011) New Revision: 2173 Url: http://nuiton.org/repositories/revision/nuiton-utils/2173 Log: Evolution #1686: Add new standard validators - enhance Luhn checksum algorithme implementation (less string -> int conversion) Modified: trunk/nuiton-validator/src/main/java/org/nuiton/validator/xwork2/field/SiretFieldValidator.java Modified: trunk/nuiton-validator/src/main/java/org/nuiton/validator/xwork2/field/SiretFieldValidator.java =================================================================== --- trunk/nuiton-validator/src/main/java/org/nuiton/validator/xwork2/field/SiretFieldValidator.java 2011-08-19 16:29:21 UTC (rev 2172) +++ trunk/nuiton-validator/src/main/java/org/nuiton/validator/xwork2/field/SiretFieldValidator.java 2011-08-19 18:56:55 UTC (rev 2173) @@ -106,12 +106,15 @@ * @return vrai si on a reussi a valider le numero */ static public boolean luhnChecksum(String siret) { - // variable intermediaire pour stocker le resultat de la 1ere multiplication - // on restocke dans une chaine, car il faut additionner les composantes - // des nombres et non pas les nombres eux meme. - String tmp = ""; - for (int i=siret.length()-1; i>=0; i--) { - int n = getDigit(siret, i); + + char[] tab = siret.toCharArray(); + int sum = 0; + for (int i=tab.length-1; i>=0; i--) { + // recuperation de la valeur + int n = getDigit(tab[i]); + + // 1ere phase il faut faire la multiplication par 1 ou 2 + // il faut faire x1 pour les paires et x2 sur les impaires. // en prenant en compte que le numero siret le plus a droite est le // 1 et le plus a gauche le 14. @@ -119,13 +122,17 @@ // il faut faire +1 sur l'indice puis un simple module 2 + 1 // nous convient n *= (i+1)%2+1; - tmp = n + tmp; - } - // 2eme phase on additionne tous les chiffres - int sum = 0; - for (int i=0; i<tmp.length(); i++) { - int n = getDigit(tmp, i); + // 2eme phase il faut faire l'addition + + // si une fois multiplie il est superieur a 9, il faut additionner + // toutes ces constituante, mais comme il ne peut pas etre superieur + // a 18, cela revient a retrancher 9 + if (n > 9) { + n -= 9; + } + + // on peut directement faire la somme sum += n; } @@ -137,16 +144,22 @@ /** - * Recupere un des chiffres de la string qui ne contient que des chiffres + * Converti un char en un entier '0' => 0 et '9' => 9, et 'A' => 10 a 'Z' => 36, + * les autres caractere sont aussi convertis pour que 'a' = 10 et 'z' = 36. + * Pour les autres c'est un indedermine * - * @param s une chaine ne contenant que des chiffres ex: 1234455688 - * @param indice la position du chiffre a recuperer, l'indice doit etre entre - * 0 et s.length()-1 + * @param c le caractere qui doit etre converti * @return le chiffre */ - static public int getDigit(String s, int indice) { - String d = s.substring(indice, indice+1); - int result = Integer.parseInt(d); + static public int getDigit(char c) { + int result = 0; + if (c >= '0' && c <= '9') { + result = c - '0'; + } else if (c >= 'A' && c <= 'Z'){ + result = c - 'A' + 10; + } else { + result = c - 'a' + 10; + } return result; } }