Hasilkan String dengan panjang tetap yang diisi dengan spasi

96

Saya perlu menghasilkan string dengan panjang tetap untuk menghasilkan file berbasis posisi karakter. Karakter yang hilang harus diisi dengan karakter spasi.

Sebagai contoh, kolom CITY memiliki panjang tetap 15 karakter. Untuk masukan "Chicago" dan "Rio de Janeiro", keluarannya adalah

"Chicago"
" Rio de Janeiro"
.

Rafael Borja
sumber
ini adalah jawaban yang benar stackoverflow.com/a/38110257/2642478
Xan

Jawaban:

125

Sejak Java 1.5 kita dapat menggunakan metode java.lang.String.format (String, Object ...) dan menggunakan format seperti printf.

String format "%1$15s"melakukan pekerjaan itu. Where 1$menunjukkan indeks argumen, smenunjukkan bahwa argumen adalah String dan 15mewakili lebar minimal String. Menempatkan itu semua bersama-sama: "%1$15s".

Untuk metode umum kami memiliki:

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

Mungkin seseorang dapat menyarankan string format lain untuk mengisi ruang kosong dengan karakter tertentu?

Rafael Borja
sumber
2
Maybe someone can suggest another format string to fill the empty spaces with an specific character?- lihat jawaban yang saya berikan.
mike
5
Menurut docs.oracle.com/javase/tutorial/essential/io/formatting.html , 1$mewakili indeks argumen dan 15lebarnya
Dmitry Minkovsky
1
Ini tidak akan membatasi string menjadi panjang 15. Jika lebih panjang, output yang dihasilkan juga akan lebih panjang dari 15
misterti
1
@misterti string.substring akan membatasinya hingga 15 karakter. Salam
Rafael Borja
1
Saya seharusnya menyebutkan itu, ya. Tetapi poin dari komentar saya adalah untuk memperingatkan tentang kemungkinan output yang lebih lama dari yang diinginkan, yang bisa menjadi masalah untuk bidang dengan panjang tetap
misterti
55

Memanfaatkan String.formatpadding dengan spasi dan ganti dengan karakter yang diinginkan.

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

Cetakan 000Apple.


Perbarui versi yang lebih berkinerja (karena tidak bergantung String.format), yang tidak memiliki masalah dengan spasi (terima kasih kepada Rafael Borja untuk petunjuknya).

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

Cetakan 00New York.

Tetapi pemeriksaan perlu ditambahkan untuk mencegah upaya membuat array karakter dengan panjang negatif.

mike
sumber
Kode yang diperbarui akan berfungsi dengan baik. Itu yang saya harapkan @thanks mike
sudharsan chandrasekaran
27

Kode ini akan memiliki jumlah karakter yang tepat; diisi dengan spasi atau terpotong di sisi kanan:

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);
}
Kurt Huwig
sumber
12

Anda juga dapat menulis metode sederhana seperti di bawah ini

public static String padString(String str, int leng) {
        for (int i = str.length(); i <= leng; i++)
            str += " ";
        return str;
    }
Yashpal Singla
sumber
8
Ini jelas bukan jawaban yang paling berhasil. Karena string tidak dapat diubah di Java, Anda pada dasarnya menghasilkan N string baru dalam memori dengan panjang yang sama dengan str.length + 1 dan karenanya sangat boros. Solusi yang jauh lebih baik hanya akan melakukan satu penggabungan string terlepas dari panjang string input dan menggunakan StringBuilder atau cara lain yang lebih efisien dari penggabungan string di perulangan for.
anon58192932
12

Untuk bantalan yang tepat yang Anda butuhkan String.format("%0$-15s", str)

Yaitu -tanda akan pad "kanan" dan tidak ada -tanda akan pad "kiri"

lihat contoh saya di sini

http://pastebin.com/w6Z5QhnJ

masukan harus berupa string dan angka

contoh masukan: Google 1

Bui Dinh Ngoc
sumber
10
import org.apache.commons.lang3.StringUtils;

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

Jauh lebih baik dari Jambu imo. Tidak pernah melihat satu pun proyek Java perusahaan yang menggunakan Guava tetapi Apache String Utils sangat umum.

anon58192932
sumber
6

Inilah trik yang rapi:

// 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();
  }
}
OldCurmudgeon
sumber
3

Berikut adalah kode dengan kasus pengujian;):

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

Saya suka TDD;)

Palgaz
sumber
3
String.format("%15s",s) // pads right
String.format("%-15s",s) // pads left

Ringkasan bagus di sini

JGFMK
sumber
1

Kode ini bekerja dengan baik. Output yang diharapkan

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

Selamat Coding !!

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

Fungsi sederhana ini bekerja untuk saya:

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

Doa:

String s = leftPad(myString, 10, "0");
WvdHooven
sumber