with - string format completar con ceros java
Entero con ceros a la izquierda (8)
Cuando escribo System.out.println(0123);
Obtengo 83
sin embargo System.out.println((int)0123F);
impresiones 123
.
¿Por qué funciona de esa manera?
Octal (número de base 8)
0123 significa octal 123, que es 1 * 8 * 8 + 2 * 8 + 3, que equivale a 83. Por alguna razón, los flotantes octales no están disponibles.
Crear 0123 significa el número entero 83. Crear 0123F significa el 123 flotante. Cuando se convierte de nuevo a entero, sigue siendo 123.
Simplemente no use el 0 inicial si no quiere decir octal. Después de todo, no son exactamente útiles (y los programadores que sí conocen los números octales se confundirán cuando vean el 09F).
El octal (0 de entrada) y el hexadecimal (0x de salida) se heredaron de C. Para comparar, pruebe
System.out.println(0x123);
En Java, los literales enteros con un cero inicial son enteros octales (base 8).
1 * 8^2 + 2 * 8 + 8 = 83
Por lo tanto, no use ningún número que conduzca con 0, si no desea tratarlo como número octal.
Cualquier número con el sufijo ''F'' es entonces tratado como número flotante.
En el ejemplo dado (inf)0123F
se imprimirá 123
porque 0123F se trata como float (123) y se convierte a int. El valor permanece 123.
Porque los literales enteros que comienzan con 0
se tratan como números octales.
Ver la sección 3.10.1 del JLS
Prueba esto:
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"
el primero impreso como 83 porque Java toma 0123 como número octal e imprime el equivalente decimal de ese número.
printf
lo hará: 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();
}
}
También podría hacer que sea "%0" + size + "%d"
si quisiera variar la duración ... aunque si las longitudes fueran comunes probablemente haría constantes como "%04d"
, "%012d"
, etc. ...
0123 -> 83
1010L -> 1010
0101L -> 65
Los números 1010L
y 0101L
no están en representación binaria (solo para evitar la confusión).
Estos números están en representación decimal.
Incluso según los patrones de Regex en documentos de Oracle ,
/ 0n es el personaje con valor octal 0n (0 <= n <= 7)
/ xhh es el personaje con valor hexadecimal 0xhh
Por lo tanto, su número 0101
ya sea en formato Integer
o Long
se trata como una representación octal de un número.
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