Jak sformatować ciąg Java z wiodącym zerem?


192

Oto ciąg znaków, na przykład:

"Apple"

i chciałbym dodać zero, aby wypełnić 8 znaków:

"000Apple"

Jak mogę to zrobić?

Odpowiedzi:


287

Jeśli musisz to zrobić bez pomocy biblioteki:

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

(Działa, o ile Twój Ciąg nie jest dłuższy niż 8 znaków).


21
To całkiem sprytne - ale zajęło mi to około 30 sekund, aby „zdobyć”. Myślę, że lepszym rozwiązaniem byłoby bardziej czytelne rozwiązanie.
Amy B

2
Jest to -doskonałe rozwiązanie, gdy osadzasz oprogramowanie na czymś bez dużej przestrzeni, a dodatkowe biblioteki po prostu nie są opcją. Dzięki!!
Casey Murray,

Ta wersja jest szalona szybko! Kocham to.
Dakkaron

2
@Mathu szczerze to nie jest trudne do zrozumienia. Dwa ciągi są łączone (łączone ze sobą) i wydobywane są z nich pierwsze 5 znaków. Bez magii. W tym przypadku nie jest to zbyt rozsądne (dla Apple o stałym ciągu), ale łatwe do zrozumienia. ("0000" + theString).substring(theString.length())jest bardziej realistyczny. To pads theStringz wiodącymi zerami. Niestety nie mogłem się powstrzymać przed dodaniem tego komentarza :)
HankCa,

1
To rozwiązanie ma krótką składnię, ale nie jest „szalone szybko”. Jeśli masz szczęście, kompilator zoptymalizuje go, ale w gruncie rzeczy prawdziwym „szybkim” sposobem na to jest użycie StringBuilder, a wypełnienie go wymaga pętli. Jeśli naprawdę wymagane jest obcięcie tylko 8-znakowych ciągów znaków, jest to w porządku, chociaż jest to bardzo wąski przypadek użycia, ale tego rozwiązania nigdy nie można nazwać szybkim. To jest po prostu krótkie.
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
ale chciałbym dodać wiodące zero przed ciągiem zamiast int.
Roy,

1
Możesz użyć StringUtils lub DecimalFormat dla Java 1.4 i niższych. Sprawdź tutaj javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
Używaj Variag %07s zamiast %07d, otrzymasz FormatFlagsConversionMismatchException. możesz tego spróbować.
Z fp

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

To jest z commons-lang . Zobacz javadoc


3
Dlaczego nie skorzystać z języka wspólnego? Ma mnóstwo przydatnych dodatków.
Bozho

7
Nawet jeśli nie możesz użyć commons-lang, możesz łatwo skopiować źródło z StringUtils, aby stworzyć własną funkcję. To byłoby znacznie lepsze ogólne rozwiązanie niż wybrana odpowiedź. docjar.com/html/api/org/apache/commons/lang/…
kaliatech

3
co jeśli byłaby to jedyna metoda, do której używana jest biblioteka? Być może dodana biblioteka jest nawet wiele razy większa niż aplikacja, w której jest używana. Mogę sobie wyobrazić całkiem sporo powodów, aby nie dodawać wspólnej biblioteki w aplikacji. Nie zrozum mnie źle: zgadzam się, zawiera bardzo przydatne rzeczy, ale rozumiem niechęć do wypychania aplikacji pełnej zewnętrznych plików JAR, jeśli korzyścią nie jest konieczność napisania tylko jednej (lub kilku) metod.
Bart Kiers

2
Aby odpowiedzieć na pytanie „Dlaczego nie użyć commons-lang? Zawiera wiele przydatnych dodatków”. pytanie z konkretnym przykładem. Xiaomi dostarcza przestarzałą wersję commons-lang na swoje urządzenia z Androidem. Dołączenie nowszej wersji do aplikacji prowadzi do konfliktów programów ładujących klasy, więc nie można już używać commons-lang w żadnym projekcie na Androida.
Nachi

1
@Nachi, nawet jeśli powinien istnieć nieaktualny plik StringUtils.leftPad
Lluis Martinez

29

O to tak naprawdę prosił, wierzę:

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

wynik:

000Apple

Nie działa w ogólnym przypadku; jeśli podstawisz „Apple” ciągiem znaków o długości 8 znaków (co jest możliwe w przypadku OP), spowoduje to wyrzucenie DuplicateFormatFlagsException(ze względu na 00ciąg formatu). Jeśli podmienisz ciąg dłuższy niż 8 znaków, spowoduje to wyrzucenie IllegalFormatFlagsException(z powodu liczby ujemnej).
nbrooks

Masz rację, ale co to wtedy: String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Teraz nie będziesz mieć tego wyjątku.
Abhinav Puri

Po prostu chcę dodać, String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);jest NIEPRAWIDŁOWE, powinno być String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .

@ user4231709 Świetne rozwiązanie! +1
użytkownik1697575

25

Możesz użyć metody String.format stosowanej w innej odpowiedzi, aby wygenerować ciąg zer,

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

Można to zastosować do problemu, dynamicznie dostosowując liczbę wiodących zer w ciągu formatu:

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

Nadal jest to niechlujne rozwiązanie, ale ma tę zaletę, że można określić całkowitą długość wynikowego łańcucha przy użyciu argumentu liczby całkowitej.



15

Możesz użyć tego:

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

Zdecydowanie najlepsza odpowiedź. Apache commons StringUtils to prosta, ale niezwykle pomocna biblioteka.
Zoidberg,

Zaoszczędziło to dużo czasu, a także jest schludne i czyste.
Abhishek

9

Byłem w podobnej sytuacji i wykorzystałem to; Jest dość zwięzły i nie musisz zajmować się długością ani inną biblioteką.

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

Prosty i schludny. Format ciągu znaków powraca, " Apple"więc po zamianie spacji na zera daje pożądany wynik.


Następnie możesz najpierw podzielić ciąg, zastosować powyższą operację do pierwszej wartości podziału, a następnie połączyć pozostałe wartości podziału.
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

Być może będziesz musiał zająć się edgecase. To jest ogólna metoda.

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

Ten fragment kodu jest mile widziany i może pomóc, ale zostałby znacznie ulepszony, gdyby zawierał wyjaśnienie, w jaki sposób rozwiązuje to pytanie. Bez tego twoja odpowiedź ma znacznie mniejszą wartość edukacyjną - pamiętaj, że odpowiadasz na pytanie czytelnikom w przyszłości, nie tylko osobie, która pyta teraz! Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia.
Toby Speight

1

W Javie:

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

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

W Scali:

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

Możesz także zbadać sposób w Javie 8, aby to zrobić za pomocą strumieni i zmniejszyć (podobnie jak w przypadku Scali). Różni się nieco od wszystkich innych rozwiązań i szczególnie mi się podoba.


0

Jest to szybkie i działa na dowolną długość.

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

Może być szybszy niż odpowiedź Chrisa Lerchera, gdy większość ciągów ma dokładnie 8 znaków

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

w moim przypadku na moim komputerze 1/8 szybciej.


0

Oto prosta wersja „czytelnego skryptu” bez interfejsu API, której używam do wstępnego wypełniania łańcucha. (Prosty, czytelny i regulowany).

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

0

Czy ktoś próbował tego czystego rozwiązania Java (bez 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");

Niestety to rozwiązanie działa tylko wtedy, gdy nie ma pustych spacji w ciągu.


0

Jeśli chcesz napisać program w czystej Javie, możesz postępować zgodnie z poniższą metodą lub istnieje wiele ciągów narzędzi, które pomogą ci lepiej z bardziej zaawansowanymi funkcjami.

Za pomocą prostej metody statycznej można to osiągnąć, jak poniżej.

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

Możesz użyć powyższej metody addLeadingText(length, padding text, your text)

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

Wynik wyniósłby 000Apple


-3

To nie jest ładne, ale działa. Jeśli masz dostęp do wspólnego apache, sugeruję, aby użyć tego

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

2
-1 jest prawdopodobnie dlatego, że nie jest to zbyt dobry przykład: używasz „magicznych liczb” i łączysz łańcuchy znaków, coś, co powinno zostać zastąpione przez StringBuilder lub StringBuffer.
Bart Kiers
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.