2010-06-30 18 views
12

La pregunta has been answered for integers printed in decimal format, pero estoy buscando una elegante manera de hacer lo mismo con los números enteros en formato no decimal (como binarios, octales, maleficio).enteros izquierda de relleno (formato no decimal) con ceros en Java

La creación de este tipo de cadenas es fácil:

String intAsString = Integer.toString(12345, 8); 

crearía una cadena con el represenation octal del valor entero 12345. Pero, ¿cómo darle formato para que la cadena tiene como 10 dígitos, además de calcular el número de ceros necesarios y ensamblar una nueva cadena 'a mano'.

Un caso de uso típico sería la creación de números binarios con un número fijo de bits (como 16, 32, ...) donde uno quisiera tener todos los dígitos, incluidos los ceros a la izquierda.

+2

Lo que quiere decir con la solución "elegante" es una función de biblioteca. Creo que no hay una solución más elegante que calcular los ceros necesarios y concatenarlos previamente. De todos modos, si hubiera un truco/algoritmo matemático para hacer lo que quiere hacer, sería diferente para binario y octal y hexadecimal ... – pakore

+0

@pakore - sí, tiene razón, alguna función de 'biblioteca' ya está presente en la API de Java sería 'más elegante' para mí;) - Odio volver a implementar este código de relleno una y otra vez. –

+0

Bueno, eche un vistazo a la clase NumberFormat, cree una clase OctalFormat, HexFormat y BinaryFormat con los métodos para agregar ceros, crear una propuesta de función, enviar su código, esperar un par de meses, actualizar sus bibliotecas y luego lo tendrá como una función de biblioteca :). O puede crear su propia biblioteca auxiliar para su proyecto: P – pakore

Respuesta

5

¿Qué tal esto (Java estándar):

private final static String ZEROES = "0000000000"; 

// ... 

String s = Integer.toString(12345, 8); 
String intAsString = s.length() <= 10 ? ZEROES.substring(s.length()) + s : s; 
+0

¡Muchas gracias! ¡Es un patrón que es bastante fácil de recordar! –

+5

Ew. Esto no indica claramente lo que está haciendo, y no es flexible en absoluto. Si desea evitar una biblioteca, simplemente escriba su propio método de relleno de cadenas y termine con ello. Seguro que no me gustaría recordar un "patrón" como este y no me gustaría verlo usando múltiples lugares en el código. – ColinD

+0

@ColinD - Estoy parcialmente de acuerdo. Si necesito relleno en el contexto de una aplicación, entonces probablemente incluiré guayaba. Pero para todos esos pequeños fragmentos y pruebas, la solución de Jespers es lo que * I * estaba buscando. –

13

Con Guava usted podría escribir:

String intAsString = Strings.padStart(Integer.toString(12345, 8), 10, '0'); 
20

Para PTU y hexagonal, es tan fácil como String.format:

assert String.format("%03x", 16) == "010"; 
assert String.format("%03o", 8) == "010"; 
+0

sí ... pero ...Estaba buscando un enfoque general, trabajando con cualquier raíz dada (con un límite superior práctico porque necesitamos letras para representar dígitos, al igual que en los valores hexadecimales) –

2

Aquí hay una alternativa más reutilizable con la ayuda de StringBuilder.

public static String padZero(int number, int radix, int length) { 
    String string = Integer.toString(number, radix); 
    StringBuilder builder = new StringBuilder().append(String.format("%0" + length + "d", 0)); 
    return builder.replace(length - string.length(), length, string).toString(); 
} 

El ejemplo de Guava publicado por ColinD es, por cierto, bastante astuto.

3

La impresión de un número hexadecimal, por ejemplo, con cero de relleno:

System.out.println(String.format("%08x", 1234)); 

dará la siguiente salida, con el relleno incluye:

000004d2 

Sustitución x con carácter de formato asociado de OCTAL se haz lo mismo, probablemente.

Cuestiones relacionadas