Risposte:
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.)
("0000" + theString).substring(theString.length())
è più realistico. Questo pad theString
con zeri iniziali. Spiacenti, non ho resistito all'aggiunta di questo commento :)
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.
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);
}
}
%07s
invece di %07d
, otterrai un FormatFlagsConversionMismatchException
. Puoi provarlo.
StringUtils.leftPad(yourString, 8, '0');
Questo è di commons-lang . Vedi javadoc
Questo è quello che stava davvero chiedendo, credo:
String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple");
produzione:
000Apple
DuplicateFormatFlagsException
(a causa della 00
stringa nel formato). Se si sostituisce una stringa più lunga di 8 caratteri, viene generata una IllegalFormatFlagsException
(a causa del numero negativo).
String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);
? Ora non avrai questa eccezione.
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);
.
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.
Utilizzando la Strings
classe di utilità di Guava :
Strings.padStart("Apple", 8, '0');
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.
String input = "Apple";
StringBuffer buf = new StringBuffer(input);
while (buf.length() < 8) {
buf.insert(0, '0');
}
String output = buf.toString();
Usa Apache Commons StringUtils.leftPad (o guarda il codice per creare la tua funzione).
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);
}
}
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;
}
}
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);
}
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;
}
}
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.
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.
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.
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
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;
}
}