Lorsque j'écris System.out.println(0123);
, je reçois 83
mais System.out.println((int)0123F);
imprime 123
.
Pourquoi ça marche comme ça?
0123 signifie octal 123, c'est-à-dire 1 * 8 * 8 + 2 * 8 + 3, ce qui équivaut à 83 ..__ Pour une raison quelconque, les flottants octaux ne sont pas disponibles.
Créer 0123 signifie un entier 83 . Créer 0123F signifie un 123 flottant. Une fois reconverti en entier, il reste 123.
Juste n'utilisez pas le 0 devant si vous ne voulez pas dire octal. Après tout, ils ne sont pas vraiment utiles (et les programmeurs qui connaissent les nombres octaux deviendront confus quand ils verront 09F).
Parce que les littéraux entiers commençant par 0
sont traités comme des nombres octaux.
Voir la section 3.10.1 du JLS
Essaye ça:
public static String leftPad(int n, int padding) {
return String.format("%0" + padding + "d", n);
}
leftPad(5, 3); // return "005"
leftPad(15, 5); // return "00015"
leftPad(224, 3); // return "224"
leftPad(0, 4); // return "0000"
Les octales (0) et hexadécimaux (0x) ont été hérités de C .
System.out.println(0x123);
le premier imprimé en 83, car Java prend 0123 en tant que nombre octal et imprime un équivalent décimal de ce nombre.
0123 -> 83
1010L -> 1010
0101L -> 65
Les nombres 1010L
et 0101L
ne sont pas en représentation binaire (juste pour éviter la confusion).
Ces nombres sont en représentation décimale.
Même selon les modèles de Regex dans Oracle docs ,
\ 0n est le caractère de valeur octale 0n (0 <= n <= 7)
\xhh est le caractère avec la valeur hexadécimale 0xhh
Ainsi, votre numéro 0101
que ce soit au format Integer
ou Long
est traité comme une représentation octale d’un nombre.
123 => 1 * 8^2 + 2 * 8^1 + 1 * 8^0 = 83
0101 => 1 * 8^2 + 0 * 8^1 + 1 * 8^0 = 64 + 0 + 1 = 65
printf
le fera: http://Java.Sun.com/developer/technicalArticles/Programming/sprintf/
public class X
{
public static void main(final String[] argv)
{
System.out.printf("%04d", 123);
System.out.println();
}
}
Vous pouvez également le rendre "%0" + size + "%d"
si vous souhaitez modifier la longueur ... bien que si les longueurs étaient communes, je ferais probablement des constantes telles que "%04d"
, "%012d"
, etc ...
En Java, les entiers avec un zéro sont des entiers octaux (base 8).
1 * 8^2 + 2 * 8 + 8 = 83
Donc, n'utilisez aucun nombre commençant par 0 si vous ne voulez pas le traiter comme un nombre octal.
Tout nombre avec le suffixe 'F' est alors traité comme un nombre flottant.
Dans l'exemple donné, (inf)0123F
imprime 123
car 0123F traitée comme float (123) et convertie en valeur int reste 123.