Quand on rencontre la classe NumberFormat en Java, en général c’est pour parser un objet String. Mais cette classe ne sert pas qu’à parser des chaînes de caractères !

Tout le monde sait faire :

String numberAsString = "12345";
int numberAsLong = NumberFormat.getInstance().parse(numberAsString);

Mais l’utilité du NumberFormat ne s’arrête pas là. Car comme son nom l’indique, il formate des nombres. Par exemple, il peut servir à padder avec des zéros un nombre[1]. Malheureusement, il n’est pas rare de trouver ce genre de code :

int numberAsInt = 12345;
int size = 8;
String numberAsString = String.valueOf(numberAsInt);
while ( numberAsString.length()<size) {
	numberAsString = "0" + numberAsString;
}

Ou une version dite améliorée proposerait ceci :

int numberAsInt = 12345;
int size = 8;
StringBuffer numberAsStringBuffer = new StringBuffer(size);
numberAsStringBuffer.append(numberAsInt);
while ( numberAsStringBuffer.length()<size) {
	numberAsStringBuffer.insert(0,0);
}
String numberAsString = numberAsStringBuffer.toString();

Alors qu’il est tellement plus simple de faire :

int numberAsInt = 12345;
int size = 8;
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumIntegerDigits(size);
nf.setGroupingUsed(false);
String numberAsString = nf.format(numberAsInt);

Un dernier point auquel il faut faire attention ou qui peut être intéressant. La classe NumberFormat permet de spécifier la taille maximale de la représentation d’un nombre. Par exemple, pour padder sur 8 positions le nombre 12345, le résultat est 00012345. Par contre, qu’en est-il pour le nombre 1234567890 ? Avec le code ci-dessus, le résultat est la chaine “1234567890”. Par contre si la représentation doit avoir une longueur de strictement 8 caractères, il faut utiliser le code suivant :

int numberAsInt = 1234567890;
int size = 8;
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumIntegerDigits(size);
nf.setMaximumIntegerDigits(size);
nf.setGroupingUsed(false);
String numberAsString = nf.format(numberAsInt);

Il faut faire attention, car dans ce cas la représentation sur 8 caractères n’est pas équivalente au nombre initial. Puisque les chiffres en trop sont tronqués à gauche. La représentation ainsi obtenue est “34567890”.

Selon les cas, cette astuce peut être intéressante ou dangereuse. Dans tous les cas, cette piqure de rappel sur le formatage des nombres ne fait pas de mal. Et il n’est pas inutile de rappeler qu’il est toujours instructif de consulter la JavaDoc !

Notes

[1] En d’autres termes, compléter à gauche un nombre avec des zéros non significatifs.