Formate um número inteiro usando o Java String Format

129

Gostaria de saber se é possível, usando o método String.format em Java, para dar um número inteiro antes de zeros?

Por exemplo:

1 se tornaria 001
2 se tornaria 002
...
11 se tornaria 011
12 se tornaria 012
...
526 permaneceria como 526
... etc.

No momento, tentei o seguinte código:

String imageName = "_%3d" + "_%s";

for( int i = 0; i < 1000; i++ ){
    System.out.println( String.format( imageName, i, "foo" ) );
}

Infelizmente, isso precede o número com 3 espaços vazios. É possível preceder o número com zeros?

Minha cabeça dói
fonte
possível duplicata de Add zeros à esquerda em Java
Jonathon Faust

Respostas:

172

Use %03dno especificador de formato para o número inteiro. Os 0meios que o número será preenchida com zeros, se for menos do que três (neste caso) dígitos.

Veja os Formatterdocumentos para outros modificadores.

Esteira
fonte
211
String.format("%03d", 1)  // => "001"
//              │││   └── print the number one
//              ││└────── ... as a decimal integer
//              │└─────── ... minimum of 3 characters wide
//              └──────── ... pad with zeroes instead of spaces

Veja java.util.Formatterpara mais informações.

maerics
fonte
13

Se você estiver usando uma biblioteca de terceiros chamada apache commons-lang, a seguinte solução pode ser útil:

Use a StringUtilsclasse do apache commons-lang :

int i = 5;
StringUtils.leftPad(String.valueOf(i), 3, "0"); // --> "005"

Como StringUtils.leftPad()é mais rápido queString.format()

Anil Bharadia
fonte
StringUtils.leftPad é outra boa opção e pode-se argumentar que é mais legível e permite que você use outros caracteres. Eu tenho um Google por perto, mas não consigo encontrar nada que confirme que é mais rápido - você poderia fornecer alguma evidência para isso?
Minha cabeça dói
github.com/anilbharadia/JavaPerformanceTests/blob/master/... executá-lo com JUnit e verificar o tempo
Anil Bharadia