Numérotation bijective sans zéro
Pour les besoins d'un projet professionnel, j'ai récemment eu à réaliser un système de numérotation bijectif sans zéro en base 26. C'était la première fois que je me retrouvais confronté à un tel besoin ; il faut dire que vouloir numéroter des entités à la manière des colonnes d'un tableau excel n'est pas une chose fréquente (ni très pertinente d'ailleurs).
Quoi qu'il en soit, j'ai du me replonger dans la table ASCII pour faire mes conversions et cela faisait bien longtemps que je n'avais pas eu à le faire. Je partage ces bouts de code Java au cas où...
Conversion base 10 -> base 26
/**
* Conversion base 10 numérique vers base 26 alpha bijective sans zéro
*/
public static String toBijectiveBase26(int nombre) {
StringBuffer sb = new StringBuffer();
while( nombre > 0 ) {
nombre--;
sb.insert( 0, (char)( 'A' + nombre % 26 ) );
nombre /= 26;
}
return sb.toString();
}
Conversion base 26 -> base 10
/**
* Conversion base 26 alpha bijective sans zéro vers base 10 numérique
*/
public static int fromBijectiveBase26(String nombre) {
int n = 0;
if ( nombre == null || nombre.length() == 0 ) {
return n;
}
int i = 0;
int c = 0;
while ( i < nombre.length() ) {
c = nombre.charAt(i);
if ( c < 'A' || c > 'Z' )
throw new NumberFormatException();
n *= 26;
n += ( c - 'A' ) + 1;
i++;
}
return n;
}
Table ASCII
Pour les curieux et pour ceux qui ne connaissent pas leur table ASCII sur le bout des doigts, voici un extrait des différents caractères utilisés dans les méthodes ci-dessus et de leurs correspondances décimales :
Déci. | Char. | Déci. | Char. | Déci. | Char. | Déci. | Char. |
---|---|---|---|---|---|---|---|
30 | 0 | 39 | 9 | 73 | I | 82 | R |
31 | 1 | 65 | A | 74 | J | 83 | S |
32 | 2 | 66 | B | 75 | K | 84 | T |
33 | 3 | 67 | C | 76 | L | 85 | U |
34 | 4 | 68 | D | 77 | M | 86 | V |
35 | 5 | 69 | E | 78 | N | 87 | W |
36 | 6 | 70 | F | 79 | O | 88 | X |
37 | 7 | 71 | G | 80 | P | 89 | Y |
38 | 8 | 72 | H | 81 | Q | 90 | Z |