Java dizesini başında sıfır ile nasıl biçimlendiririm?


192

İşte Dize, örneğin:

"Apple"

ve 8 karakter doldurmak için sıfır eklemek istiyorum:

"000Apple"

Bunu nasıl yapabilirim?

Yanıtlar:


287

Bunu bir kütüphane yardımı olmadan yapmanız gerektiğinde:

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

(Dizeniz 8 karakterden uzun olmadığı sürece çalışır.)


21
Bu oldukça akıllı - ama "anlamam" yaklaşık 30 saniye sürdü. Bence daha okunabilir bir çözüm daha iyi olurdu.
Amy B

2
Yazılımı çok fazla alan olmayan bir şeye gömdüğünüzde ve ekstra kütüphaneler sadece bir seçenek olmadığında bu mükemmel bir çözümdür. Teşekkürler!!
Casey Murray

Bu sürüm çılgın hızlı! Onu seviyorum.
Dakkaron

2
@Mathu dürüstçe anlamak zor değil. İki dize birleştirilir (birleştirilir) ve ilk 5 karakter ondan çıkarılır. Sihir yok. Bu durumda çok mantıklı değil (sabit dize Apple için) ama anlaşılması kolay. ("0000" + theString).substring(theString.length())daha gerçekçi. Bu theString, önde gelen sıfırlarla doluyor. Üzgünüz, bu yorumu
ekleyemedim

1
Bu çözüm kısa bir sözdizimine sahiptir ancak "çılgın hızlı" değildir. Eğer şanslıysanız derleyici onu optimize edecek ama aslında bunu yapmanın gerçek "hızlı" yolu a kullanıyor StringBuilderve onu doldurmak için bir döngü gerekiyor. Gereksinim gerçekten sadece 8 karakterli dizeleri kısaltmaksa, bu çok dar bir kullanım durumu olsa da, bu çözüm asla hızlı çağrılamaz. Sadece kısa.
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
ancak int yerine bir dizeden önce baştaki sıfır eklemek istiyorum.
Roy

1
Java 1.4 ve önceki sürümleri için StringUtils veya DecimalFormat kullanabilirsiniz. Buraya bakın javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
@Variag kullanmak %07s yerine, %07dbir alacaksınız FormatFlagsConversionMismatchException. deneyebilirsin.
Z fp

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

Bu commons-lang'den . Bkz. Javadoc


3
Neden commons-lang kullanmıyorsunuz? Yararlı ekstralar yağma vardır.
Bozho

7
Commons-lang'i kullanamasanız bile, kendi fonksiyonunuzu oluşturmak için kaynağı StringUtils'ten kolayca kopyalayabilirsiniz. Bu, seçilen cevaptan çok daha iyi bir genel çözüm olacaktır. docjar.com/html/api/org/apache/commons/lang/…
kaliatech

3
ya kütüphane için kullanılan tek yöntem bu olurdu? Belki eklenen kitaplık ise kullanıldığı app bile birçok kez daha büyüktür. Oldukça bazı nedenler hayal değil bir uygulamada bir commons kütüphane ekleyin. Beni yanlış anlamayın: Katılıyorum, çok yararlı şeyler içeriyor, ancak yararın sadece bir (veya birkaç) yöntem yazması gerekmiyorsa harici JAR'larla dolu bir uygulamayı doldurma konusundaki isteksizliği anlıyorum.
Bart Kiers

2
Cevaplamak için "Neden commons-lang kullanılmasın? O kullanışlı ekstralar yağma var." somut bir örnekle sorun. Xiaomi, Android cihazlarında commons-lang'ın eski bir sürümünü gönderiyor. Uygulamanıza daha yeni bir sürüm eklemek sınıf yükleyici çakışmalarına yol açar, bu nedenle commons-lang artık herhangi bir Android projesinde kullanılamaz.
Nachi

1
@Nachi modası geçmiş StringUtils.leftPad olsa bile
Lluis Martinez

29

Ben gerçekten bunu istediğine inanıyorum:

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

çıktı:

000Apple

Genel dava için çalışmıyor; "Apple" harfini 8 karakter uzunluğunda bir dize ile değiştirirseniz (OP'nin durumunda mümkündür) bu a DuplicateFormatFlagsExceptiondeğerini ( 00biçim dizesindeki nedeniyle ) atar . 8 karakterden daha uzun bir dize koyarsanız, bu IllegalFormatFlagsException(negatif sayı nedeniyle) atar .
nbrooks

Daha sonra bu konuda doğru, ama ne şunlardır: String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Şimdi bu istisna olmayacak.
Abhinav Puri

Sadece eklemek istiyorum String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);YANLIŞ, olmalı String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .

@ user4231709 Harika bir çözüm! +1
user1697575

25

0'lı bir dize oluşturmak için başka bir yanıtta kullanılan String.format yöntemini kullanabilirsiniz,

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

Bu, bir biçim dizesindeki önde gelen 0 sayısını dinamik olarak ayarlayarak sorununuza uygulanabilir:

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

Hala dağınık bir çözümdür, ancak bir tamsayı argümanı kullanarak sonuçlanan dizenin toplam uzunluğunu belirtebilme avantajına sahiptir.



15

Bunu kullanabilirsiniz:

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

En iyi cevap. Apache commons StringUtils basit ama son derece yararlı bir kütüphanedir.
Zoidberg

Bu çok zaman kazandı ve aynı zamanda temiz ve temiz.
Abhishek

9

Benzer bir durumdaydım ve bunu kullandım; Oldukça özlü ve uzunluk veya başka bir kütüphane ile uğraşmak zorunda değilsiniz.

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

Basit ve temiz. Dize biçimi, " Apple"alanı sıfırlarla değiştirdikten sonra istenen sonucu verir.


Ardından, ilk önce dizeyi bölmek, yukarıdaki işlemi ilk bölünmüş değere uygulamak, bölünmüş değerlerin geri kalanını birleştirmek isteyebilirsiniz.
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

Edgecase ile ilgilenmeniz gerekebilir. Bu genel bir yöntemdir.

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

Bu kod snippet'i hoş geldiniz ve bazı yardımlar sağlayabilir, ancak soruyu nasıl ele aldığına dair bir açıklama içeriyorsa büyük ölçüde geliştirilecektir . Bu olmadan, cevabınızın çok daha az eğitimsel değeri vardır - sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın! Lütfen açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin.
Toby Speight

1

Java dilinde:

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

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

Scala'da:

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

Ayrıca Java 8'de akışları kullanarak bunu yapmanın bir yolunu keşfedebilir ve azaltabilirsiniz (Scala ile yaptığım gibi). Diğer tüm çözümlerden biraz farklı ve özellikle çok beğendim.


0

Bu hızlıdır ve her uzunlukta çalışır.

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

String'deki çoğu tam olarak 8 karaktere sahip olduğunda Chris Lercher'ın cevabından daha hızlı olabilir

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

benim durumumda 1/8 daha hızlı.


0

İşte bir dize ön doldurma için kullandığım basit API'sız "okunabilir komut dosyası" sürümü. (Basit, Okunabilir ve Ayarlanabilir).

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

0

Herkes bu saf Java çözümünü denedi mi (SpringUtils olmadan):

//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");

Ne yazık ki bu çözüm yalnızca bir dizede boş alan yoksa çalışır.


0

Programı saf Java'da yazmak istiyorsanız, aşağıdaki yöntemi takip edebilirsiniz veya daha gelişmiş özelliklerle daha iyi yardımcı olmak için birçok String Utils vardır.

Basit bir statik yöntem kullanarak bunu aşağıdaki gibi yapabilirsiniz.

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

Yukarıdaki yöntemi kullanabilirsiniz addLeadingText(length, padding text, your text)

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

Çıktı 000Apple olur


-3

Güzel değil, ama işe yarıyor. Eğer erişim apache commons varsa ben bunu kullanmanızı öneririz

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

2
-1 muhtemelen bunun çok iyi bir örnek olmamasıdır: "sihirli sayılar" kullanıyorsunuz ve bir StringBuilder veya StringBuffer kullanarak değiştirilmesi gereken Dizeleri birleştiriyorsunuz.
Bart Kiers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.