Como formatar uma string Java com zero à esquerda?

191

Aqui está a String, por exemplo:

"Apple"

e gostaria de adicionar zero para preencher 8 caracteres:

"000Apple"

Como posso fazer isso?

Roy
fonte

Respostas:

287

Caso você precise fazer isso sem a ajuda de uma biblioteca:

("00000000" + "Apple").substring("Apple".length())

(Funciona, desde que sua String não tenha mais de 8 caracteres.)

Chris Lercher
fonte
21
Isso é bem inteligente - mas levei cerca de 30 segundos para "entender". Eu acho que uma solução mais legível seria melhor.
Amy B
2
Esta é uma solução excelente quando você incorpora software em algo sem muito espaço e as bibliotecas extras simplesmente não são uma opção. Obrigado!!
Casey Murray
Esta versão é louca rápido! Eu amo isso.
Dakkaron 02/07
2
@ Matu honestamente isso não é difícil de entender. Duas cadeias são concatenadas (unidas) e os 5 primeiros caracteres são extraídos dela. Nenhuma mágica. Não é muito sensível neste caso (para Apple de cadeia fixa), mas fácil de entender. ("0000" + theString).substring(theString.length())é mais realista. Isso apaga theStringcom zeros à esquerda. Desculpe não poderia resistir adicionar este comentário :)
HankCa
1
Esta solução tem uma sintaxe curta, mas não é "louca". Se você tiver sorte, o compilador irá otimizá-lo, mas essencialmente a maneira "rápida" real de fazer isso é usar StringBuilderae é necessário um loop para preenchê-lo. Se o requisito é realmente apenas truncar seqüências de caracteres de 8 caracteres, tudo bem, embora seja um caso de uso muito restrito, mas essa solução nunca pode ser chamada rapidamente. É apenas curto.
Dici 5/16
319
public class LeadingZerosExample {
    public static void main(String[] args) {
       int number = 1500;

       // String format below will add leading zeros (the %0 syntax) 
       // to the number above. 
       // The length of the formatted string will be 7 characters.

       String formatted = String.format("%07d", number);

       System.out.println("Number with leading zeros: " + formatted);
    }
}
Alex Rashkov
fonte
14
mas eu gostaria de adicionar o zero inicial antes de uma string em vez de um int.
Roy
1
Você pode usar StringUtils ou DecimalFormat para Java 1.4 e abaixo. Verifique aqui javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev 5/15
3
@Variag use em %07s vez de %07d, você receberá um FormatFlagsConversionMismatchException. você pode experimentá-lo.
Z fp
127
 StringUtils.leftPad(yourString, 8, '0');

Isto é de commons-lang . Veja javadoc

Bozho
fonte
3
Por que não usar o commons-lang? Possui muitos extras úteis.
Bozho 29/10/10
7
Mesmo se você não conseguir usar o commons-lang, poderá copiar facilmente a fonte do StringUtils para criar sua própria função. Essa seria uma solução geral muito melhor do que a resposta selecionada. docjar.com/html/api/org/apache/commons/lang/…
kaliatech
3
e se esse fosse o único método para o qual a biblioteca é usada? Talvez a biblioteca adicionada seja muitas vezes maior que o aplicativo em que é usada. Posso imaginar alguns motivos para não adicionar uma biblioteca comum a um aplicativo. Não me entenda mal: concordo, ele contém coisas muito úteis, mas entendo a relutância em encher um aplicativo cheio de JARs externos se o benefício não precisar escrever apenas um (ou dois) métodos.
Bart Kiers
2
Para responder a "Por que não usar o commons-lang? Ele possui muitos extras úteis". pergunta com um exemplo concreto. A Xiaomi envia uma versão desatualizada do commons-lang em seus dispositivos Android. A inclusão de uma versão mais recente no seu aplicativo leva a conflitos no carregador de classes, portanto o commons-lang não pode mais ser usado em nenhum projeto do Android.
Nachi
1
@Nachi mesmo que o StringUtils.leftPad desatualizado exista #
Lluis Martinez
29

Isto é o que ele estava realmente pedindo, acredito:

String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple"); 

resultado:

000Apple

fonte
Não funciona para o caso geral; se você substituir "Apple" por uma sequência de 8 caracteres de comprimento (o que é possível no caso do OP), isso gera a DuplicateFormatFlagsException(devido 00à sequência de caracteres no formato). Se você substituir uma sequência com mais de 8 caracteres, isso gera um IllegalFormatFlagsException(por causa do número negativo).
nbrooks
Você está certo, mas o que sobre isso, então: String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Agora você não terá essa exceção.
Abhinav Puri
Só quero adicionar String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);está errado, deveria ser String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .
@ user4231709 Ótima solução! +1
user1697575 12/06
25

Você pode usar o método String.format conforme usado em outra resposta para gerar uma sequência de 0,

String.format("%0"+length+"d",0)

Isso pode ser aplicado ao seu problema ajustando dinamicamente o número de 0s iniciais em uma sequência de formato:

public String leadingZeros(String s, int length) {
     if (s.length() >= length) return s;
     else return String.format("%0" + (length-s.length()) + "d%s", 0, s);
}

Ainda é uma solução confusa, mas tem a vantagem de poder especificar o comprimento total da sequência resultante usando um argumento inteiro.

ChadyWady
fonte
17

Usando a Stringsclasse de utilitário do Guava :

Strings.padStart("Apple", 8, '0');
Olivier Grégoire
fonte
15

Você pode usar isto:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")
Bency Baby
fonte
De longe a melhor resposta. O Apache commons StringUtils é uma biblioteca simples, mas extremamente útil.
Zoidberg 28/07
Isso economizou muito tempo e também é limpo e arrumado.
Abhishek
9

Eu já estive em uma situação semelhante e usei isso; É bastante conciso e você não precisa lidar com o comprimento ou outra biblioteca.

String str = String.format("%8s","Apple");
str = str.replace(' ','0');

Simples e arrumado. O formato da string retorna " Apple"e, após substituir o espaço por zeros, fornece o resultado desejado.

Erdi İzgi
fonte
Em seguida, convém dividir a sequência primeiro, aplique a operação acima ao primeiro valor da divisão e concatenar o restante dos valores da divisão.
Erdi İzgi 19/03/19
6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

while (buf.length() < 8) {
  buf.insert(0, '0');
}

String output = buf.toString();
robert_x44
fonte
1
public class PaddingLeft {
    public static void main(String[] args) {
        String input = "Apple";
        String result = "00000000" + input;
        int length = result.length();
        result = result.substring(length - 8, length);
        System.out.println(result);
    }
}
Arne Deutsch
fonte
1

Você pode precisar cuidar do edgecase. Este é um método genérico.

public class Test {
    public static void main(String[] args){
        System.out.println(padCharacter("0",8,"hello"));
    }
    public static String padCharacter(String c, int num, String str){
        for(int i=0;i<=num-str.length()+1;i++){str = c+str;}
        return str;
    }
}
bragboy
fonte
1
public static void main(String[] args)
{
    String stringForTest = "Apple";
    int requiredLengthAfterPadding = 8;
    int inputStringLengh = stringForTest.length();
    int diff = requiredLengthAfterPadding - inputStringLengh;
    if (inputStringLengh < requiredLengthAfterPadding)
    {
        stringForTest = new String(new char[diff]).replace("\0", "0")+ stringForTest;
    }
    System.out.println(stringForTest);
}
Fathah Rehman P
fonte
1
public static String lpad(String str, int requiredLength, char padChar) {
    if (str.length() > requiredLength) {
        return str;
    } else {
        return new String(new char[requiredLength - str.length()]).replace('\0', padChar) + str;
    }
}
Nabil_H
fonte
Embora esse trecho de código seja bem-vindo e possa fornecer alguma ajuda, ele seria muito melhorado se incluísse uma explicação de como ele aborda a questão. Sem isso, sua resposta tem muito menos valor educacional - lembre-se de que você está respondendo à pergunta dos leitores no futuro, não apenas à pessoa que está perguntando agora! Por favor edite sua resposta para adicionar explicação, e dar uma indicação do que limitações e premissas se aplicam.
Toby Speight
1

Em Java:

String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;

Em Scala:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

Você também pode explorar uma maneira no Java 8 de fazê-lo usando fluxos e reduções (semelhante à maneira que eu fiz com o Scala). É um pouco diferente de todas as outras soluções e eu particularmente gosto muito.

Carlos
fonte
0

Isso é rápido e funciona para qualquer tamanho.

public static String prefixZeros(String value, int len) {
    char[] t = new char[len];
    int l = value.length();
    int k = len-l;
    for(int i=0;i<k;i++) { t[i]='0'; }
    value.getChars(0, l, t, k);
    return new String(t);
}
Deian
fonte
0

Pode ser mais rápido do que Chris Lercher responde quando a maioria das String tem exatamente 8 caracteres

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);

no meu caso na minha máquina 1/8 mais rápido.

Kuguar6
fonte
0

Aqui está a versão simples "script legível" sem API que eu uso para preencher previamente uma string. (Simples, legível e ajustável).

while(str.length() < desired_length)
  str = '0'+str;
Tezra
fonte
0

Alguém tentou esta solução Java pura (sem SpringUtils):

//decimal to hex string 1=> 01, 10=>0A,..
String.format("%1$2s", Integer.toString(1,16) ).replace(" ","0");
//reply to original question, string with leading zeros. 
//first generates a 10 char long string with leading spaces, and then spaces are
//replaced by a zero string. 
String.format("%1$10s", "mystring" ).replace(" ","0");

Infelizmente, esta solução funciona apenas se você não tiver espaços em branco em uma string.

Gico
fonte
0

Se você deseja escrever o programa em Java puro, siga o método abaixo ou existem muitos String Utils para ajudá-lo melhor com os recursos mais avançados.

Usando um método estático simples, você pode conseguir isso como abaixo.

public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}

Você pode usar o método acima addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

A produção seria 000Apple

Googliano
fonte
-3

Não é bonito, mas funciona. Se você tiver acesso ao apache commons, sugiro que use esse

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}
mR_fr0g
fonte
2
O -1 é provavelmente porque este não é um exemplo tão bom: você está usando "números mágicos" e está concatenando Strings, algo que deve ser substituído usando um StringBuilder ou StringBuffer.
Bart Kiers