Beyaz boşluklarla dolu sabit uzunlukta dizeler oluşturun


99

Karakter konumu tabanlı bir dosya oluşturmak için sabit uzunlukta bir dizi üretmem gerekiyor. Eksik karakterler boşluk karakteri ile doldurulmalıdır.

Örnek olarak, CITY alanının sabit uzunluğu 15 karakterdir. "Chicago" ve "Rio de Janeiro" girdileri için çıktılar

"Chicago"
"Rio de Janeiro"
.


Yanıtlar:


129

Java 1.5'ten beri java.lang.String.format (String, Object ...) yöntemini ve printf benzeri formatı kullanabiliriz.

Biçim dizesi "%1$15s"işi yapar. Burada 1$tartışma dizinini gösterir, sbağımsız değişken bir String ve belirtir 15String minimum genişliğe temsil eder. Hep birlikte aktarmak: "%1$15s".

Genel bir yöntem için elimizde:

public static String fixedLengthString(String string, int length) {
    return String.format("%1$"+length+ "s", string);
}

Belki birisi boş alanları belirli bir karakterle doldurmak için başka bir biçim dizesi önerebilir?


2
Maybe someone can suggest another format string to fill the empty spaces with an specific character?- verdiğim cevaba bir bak.
Mike

5
Docs.oracle.com/javase/tutorial/essential/io/formatting.html'ye göre 1$, argüman endeksini ve 15genişliği temsil eder
Dmitry Minkovsky

2
Bu, dizgiyi 15 ile sınırlamaz. Daha uzunsa, üretilen çıktı da 15'ten daha uzun olacaktır
misterti

1
@misterti bir string.substring bunu 15 karakterle sınırlar. Saygılarımızla
Rafael Borja

1
Bundan bahsetmeliydim, evet. Ancak
yorumumun amacı

56

Kullanın String.formatboşluklu 'nin dolgu ve istenen karakter ile değiştirin.

String toPad = "Apple";
String padded = String.format("%8s", toPad).replace(' ', '0');
System.out.println(padded);

Baskılar 000Apple.


String.formatBoşluklarla ilgili bir problemi olmayan (ipucu için Rafael Borja'ya teşekkürler) daha performanslı sürümü güncelleyin (dayanmadığı için).

int width = 10;
char fill = '0';

String toPad = "New York";
String padded = new String(new char[width - toPad.length()]).replace('\0', fill) + toPad;
System.out.println(padded);

Baskılar 00New York.

Ancak negatif uzunlukta bir char dizisi oluşturma girişimini önlemek için bir kontrol eklenmesi gerekir.


Güncellenen kod harika çalışacaktır. Beklediğim şey @thanks mike
sudharsan chandrasekaran

28

Bu kod, tam olarak verilen miktarda karakter içerecektir; sağ tarafta boşluklarla dolu veya kesilmiş:

private String leftpad(String text, int length) {
    return String.format("%" + length + "." + length + "s", text);
}

private String rightpad(String text, int length) {
    return String.format("%-" + length + "." + length + "s", text);
}

13

Doğru ped için ihtiyacınız olan String.format("%0$-15s", str)

yani -işaret "sağ" pedi -olacak ve hiçbir işaret "sol" pedi olmayacak

buradaki örneğime bakın

http://pastebin.com/w6Z5QhnJ

girdi bir dize ve bir sayı olmalıdır

örnek giriş: Google 1


12

Aşağıdaki gibi basit bir yöntem de yazabilirsiniz

public static String padString(String str, int leng) {
        for (int i = str.length(); i <= leng; i++)
            str += " ";
        return str;
    }

8
Bu kesinlikle en başarılı cevap değil. Java'da dizeler değişmez olduğundan, aslında bellekte str.length + 1'e eşit uzunlukta N yeni dizge oluşturuyorsunuz ve bu nedenle oldukça israf ediyor. Çok daha iyi bir çözüm, girdi dizesi uzunluğuna bakılmaksızın yalnızca bir dizi birleştirme gerçekleştirir ve StringBuilder'ı veya for döngüsünde dize birleştirme için daha verimli başka bir yolu kullanır.
anon58192932

10
import org.apache.commons.lang3.StringUtils;

String stringToPad = "10";
int maxPadLength = 10;
String paddingCharacter = " ";

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

Guava imodan çok daha iyi. Guava kullanan tek bir kurumsal Java projesi görmedim, ancak Apache String Utils inanılmaz derecede yaygın.



6

İşte güzel bir numara:

// E.g pad("sss","00000000"); should deliver "00000sss".
public static String pad(String string, String pad) {
  /*
   * Add the pad to the left of string then take as many characters from the right 
   * that is the same length as the pad.
   * This would normally mean starting my substring at 
   * pad.length() + string.length() - pad.length() but obviously the pad.length()'s 
   * cancel.
   *
   * 00000000sss
   *    ^ ----- Cut before this character - pos = 8 + 3 - 8 = 3
   */
  return (pad + string).substring(string.length());
}

public static void main(String[] args) throws InterruptedException {
  try {
    System.out.println("Pad 'Hello' with '          ' produces: '"+pad("Hello","          ")+"'");
    // Prints: Pad 'Hello' with '          ' produces: '     Hello'
  } catch (Exception e) {
    e.printStackTrace();
  }
}

4
String.format("%15s",s) // pads right
String.format("%-15s",s) // pads left

Burada harika bir özet


3

İşte test durumlarını içeren kod;):

@Test
public void testNullStringShouldReturnStringWithSpaces() throws Exception {
    String fixedString = writeAtFixedLength(null, 5);
    assertEquals(fixedString, "     ");
}

@Test
public void testEmptyStringReturnStringWithSpaces() throws Exception {
    String fixedString = writeAtFixedLength("", 5);
    assertEquals(fixedString, "     ");
}

@Test
public void testShortString_ReturnSameStringPlusSpaces() throws Exception {
    String fixedString = writeAtFixedLength("aa", 5);
    assertEquals(fixedString, "aa   ");
}

@Test
public void testLongStringShouldBeCut() throws Exception {
    String fixedString = writeAtFixedLength("aaaaaaaaaa", 5);
    assertEquals(fixedString, "aaaaa");
}


private String writeAtFixedLength(String pString, int lenght) {
    if (pString != null && !pString.isEmpty()){
        return getStringAtFixedLength(pString, lenght);
    }else{
        return completeWithWhiteSpaces("", lenght);
    }
}

private String getStringAtFixedLength(String pString, int lenght) {
    if(lenght < pString.length()){
        return pString.substring(0, lenght);
    }else{
        return completeWithWhiteSpaces(pString, lenght - pString.length());
    }
}

private String completeWithWhiteSpaces(String pString, int lenght) {
    for (int i=0; i<lenght; i++)
        pString += " ";
    return pString;
}

TDD'yi seviyorum;)


1

Bu kod harika çalışıyor. Beklenen çıktı

  String ItemNameSpacing = new String(new char[10 - masterPojos.get(i).getName().length()]).replace('\0', ' ');
  printData +=  masterPojos.get(i).getName()+ "" + ItemNameSpacing + ":   " + masterPojos.get(i).getItemQty() +" "+ masterPojos.get(i).getItemMeasure() + "\n";

Mutlu Kodlama !!


0
public static String padString(String word, int length) {
    String newWord = word;
    for(int count = word.length(); count < length; count++) {
        newWord = " " + newWord;
    }
    return newWord;
}

0

Bu basit işlev benim için çalışıyor:

public static String leftPad(String string, int length, String pad) {
      return pad.repeat(length - string.length()) + string;
    }

Çağrı:

String s = leftPad(myString, 10, "0");
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.