Come formattare una stringa Java con zero iniziale?


192

Ecco la stringa, ad esempio:

"Apple"

e vorrei aggiungere zero per compilare 8 caratteri:

"000Apple"

Come posso farlo?

Risposte:


287

Nel caso in cui devi farlo senza l'aiuto di una libreria:

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

(Funziona, purché la stringa non sia più lunga di 8 caratteri.)


21
È abbastanza intelligente, ma mi ci sono voluti circa 30 secondi per "ottenerlo". Penso che una soluzione più leggibile sarebbe migliore.
Amy B,

2
Questa è una soluzione eccellente quando si incorpora software in qualcosa senza molto spazio e le librerie extra non sono un'opzione. Grazie!!
Casey Murray,

Questa versione è follemente veloce! Lo adoro.
Dakkaron,

2
@Mathu onestamente non è difficile da capire. Vengono concatenate due stringhe (unite insieme) e vengono estratti i primi 5 caratteri. Nessuna magia. Non molto sensato in questo caso (per stringa fissa Apple) ma facile da capire. ("0000" + theString).substring(theString.length())è più realistico. Questo pad theStringcon zeri iniziali. Spiacenti, non ho resistito all'aggiunta di questo commento :)
HankCa,

1
Questa soluzione ha una sintassi breve ma non è "follemente veloce". Se sei fortunato, il compilatore lo ottimizzerà, ma essenzialmente il vero modo "veloce" per farlo è usare un StringBuilder, e ci vuole un ciclo per riempirlo. Se il requisito è davvero quello di troncare solo stringhe di 8 caratteri, va bene, anche se questo è un caso d'uso molto ristretto, ma questa soluzione non può mai essere chiamata veloce. È solo breve.
Dici,

321
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);
    }
}

14
ma vorrei aggiungere zero iniziale prima di una stringa anziché di un int.
Roy,

1
È possibile utilizzare StringUtils o DecimalFormat per Java 1.4 e versioni precedenti. Controlla qui javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
@Variag usa %07s invece di %07d, otterrai un FormatFlagsConversionMismatchException. Puoi provarlo.
Z fp

127
 StringUtils.leftPad(yourString, 8, '0');

Questo è di commons-lang . Vedi javadoc


3
Perché non usare commons-lang? Ha un sacco di extra utili.
Bozho,

7
Anche se non sei in grado di usare commons-lang, puoi facilmente copiare il sorgente da StringUtils per creare la tua funzione. Sarebbe una soluzione generale molto migliore della risposta selezionata. docjar.com/html/api/org/apache/commons/lang/…
kaliatech

3
e se fosse l'unico metodo per cui viene utilizzata la libreria? Forse la libreria aggiunta è anche molte volte più grande dell'app in cui è usata. Posso immaginare alcuni motivi per non aggiungere una libreria comune in un'applicazione. Non fraintendetemi: sono d'accordo, contiene cose molto utili, ma capisco la riluttanza a riempire un'app piena di JAR esterni se il vantaggio non ha bisogno di scrivere solo uno (o un paio) di metodi.
Bart Kiers,

2
Per rispondere al "Perché non usare commons-lang? Ha un sacco di extra utili." domanda con un esempio concreto. Xiaomi distribuisce una versione obsoleta di commons-lang sui suoi dispositivi Android. L'inclusione di una versione più recente nella tua app porta a conflitti con il classloader, quindi i beni comuni non possono più essere utilizzati in nessun progetto Android.
Nachi,

1
@Nachi anche se dovrebbe esistere StringUtils.leftPad obsoleto
Lluis Martinez,

29

Questo è quello che stava davvero chiedendo, credo:

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

produzione:

000Apple

Non funziona per il caso generale; se sostituisci "Apple" con una stringa di lunghezza di 8 caratteri (che è possibile nel caso di OP), questo genera un DuplicateFormatFlagsException(a causa della 00stringa nel formato). Se si sostituisce una stringa più lunga di 8 caratteri, viene generata una IllegalFormatFlagsException(a causa del numero negativo).
nbrooks

Hai ragione, ma allora String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); ? Ora non avrai questa eccezione.
Abhinav Puri

Voglio solo aggiungere String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);è SBAGLIATO, dovrebbe essere String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .

@ user4231709 Ottima soluzione! +1
user1697575

25

Puoi utilizzare il metodo String.format come utilizzato in un'altra risposta per generare una stringa di 0,

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

Questo può essere applicato al tuo problema regolando dinamicamente il numero di 0 iniziali in una stringa di 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);
}

È ancora una soluzione disordinata, ma ha il vantaggio di poter specificare la lunghezza totale della stringa risultante utilizzando un argomento intero.



15

Puoi usare questo:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")

Di gran lunga la migliore risposta. Apache commons StringUtils è una libreria semplice ma estremamente utile.
Zoidberg,

Ciò ha permesso di risparmiare molto tempo ed è pulito e ordinato.
Abhishek,

9

Sono stato in una situazione simile e l'ho usato; È abbastanza conciso e non devi occuparti della lunghezza o di un'altra libreria.

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

Semplice e pulito. Il formato stringa ritorna " Apple"quindi, dopo aver sostituito lo spazio con zeri, fornisce il risultato desiderato.


Quindi potresti voler prima dividere la stringa, applicare l'operazione sopra al primo valore di divisione, quindi concatenare il resto dei valori di divisione.
Erdi İzgi,

6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

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

String output = buf.toString();


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);
    }
}

1

Potrebbe essere necessario occuparsi di edgecase. Questo è un metodo generico.

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;
    }
}

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);
}

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;
    }
}

Sebbene questo frammento di codice sia il benvenuto e possa fornire qualche aiuto, sarebbe notevolmente migliorato se includesse una spiegazione di come affronta la domanda. Senza questo, la tua risposta ha un valore educativo molto inferiore: ricorda che in futuro stai rispondendo alla domanda per i lettori, non solo per la persona che chiede ora! Si prega di modificare la risposta di aggiungere una spiegazione, e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Toby Speight,

1

In Java:

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

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

Alla Scala:

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

Puoi anche esplorare un modo in Java 8 per farlo usando i flussi e riduci (simile al modo in cui l'ho fatto con Scala). È un po 'diverso da tutte le altre soluzioni e mi piace particolarmente.


0

Questo è veloce e funziona per qualsiasi lunghezza.

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);
}

0

Può essere più veloce della risposta di Chris Lercher quando la maggior parte di String ha esattamente 8 caratteri

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

nel mio caso sulla mia macchina 1/8 più veloce.


0

Ecco la semplice versione "script leggibile" senza API che uso per pre-riempire una stringa. (Semplice, leggibile e regolabile).

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

0

Qualcuno ha provato questa soluzione Java pura (senza 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");

Sfortunatamente questa soluzione funziona solo se non si hanno spazi vuoti in una stringa.


0

Se vuoi scrivere il programma in puro Java puoi seguire il metodo seguente o ci sono molti String Utils per aiutarti meglio con funzionalità più avanzate.

Utilizzando un semplice metodo statico è possibile ottenere questo come di seguito.

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;
}

Puoi usare il metodo sopra addLeadingText(length, padding text, your text)

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

L'output sarebbe 000Apple


-3

Non è carino, ma funziona. Se hai accesso a Apache Commons ti suggerirei di usarlo

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}

2
Probabilmente -1 è perché questo non è un buon esempio: stai usando "numeri magici" e stai concatenando String, qualcosa che dovrebbe essere sostituito usando StringBuilder o StringBuffer.
Bart Kiers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.