it-swarm.com.de

Generieren Sie Strings mit fester Länge, die mit Leerzeichen gefüllt sind

Ich muss eine Zeichenfolge mit fester Länge erzeugen, um eine auf Zeichenposition basierende Datei zu erzeugen. Die fehlenden Zeichen müssen mit Leerzeichen gefüllt werden. 

Das Feld CITY hat beispielsweise eine feste Länge von 15 Zeichen. Für die Eingänge "Chicago" und "Rio de Janeiro" sind die Ausgänge

"Chicago" 
 "Rio de Janeiro"
.

74
Rafael Borja

Seit Java 1.5 können wir die Methode Java.lang.String.format (String, Object ...) verwenden und das printf-ähnliche Format verwenden.

Die Formatzeichenfolge "%1$15s" erledigt den Job. Wenn 1$ den Argumentindex angibt, gibt s an, dass das Argument ein String ist, und 15 stellt die minimale Breite des String ..__ dar. Alles zusammen setzen: "%1$15s".

Für eine allgemeine Methode haben wir:

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

Vielleicht kann jemand eine andere Formatzeichenfolge vorschlagen, um die leeren Felder mit einem bestimmten Zeichen zu füllen?

104
Rafael Borja

Verwenden Sie die Auffüllung von String.format mit Leerzeichen und ersetzen Sie sie durch das gewünschte Zeichen.

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

Druckt 000Apple.


Update leistungsfähigere Version (da sie nicht auf String.format angewiesen ist), hat das kein Problem mit Leerzeichen (danke an Rafael Borja für den Hinweis).

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

Druckt 00New York.

Es muss jedoch ein Häkchen hinzugefügt werden, um zu verhindern, dass ein Zeichenarray mit negativer Länge erstellt wird.

45
mike

Dieser Code hat genau die angegebene Anzahl von Zeichen. mit Leerzeichen gefüllt oder auf der rechten Seite abgeschnitten:

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

Sie können auch eine einfache Methode wie unten beschrieben schreiben

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

Die Guava Library has Strings.padStart macht genau das, was Sie wollen, zusammen mit vielen anderen nützlichen Dienstprogrammen. 

9
jricher

Für das rechte Pad benötigen Sie das String.format("%0$-15s", str)- Zeichen, das das rechte Pad nicht macht - das linke Pad

siehe mein Beispiel hier 

http://Pastebin.com/w6Z5QhnJ

eingabe muss eine Zeichenfolge und eine Zahl sein 

beispieleingabe: Google 1

8
Bui Dinh Ngoc
import org.Apache.commons.lang3.StringUtils;

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

Viel besser als Guava imo. Ich habe noch nie ein einzelnes Enterprise-Java-Projekt gesehen, das Guava verwendet, aber Apache String Utils ist unglaublich verbreitet.

8
anon58192932

Hier ist ein toller Trick:

// 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
OldCurmudgeon

Hier ist der Code mit Testfällen;):

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

Ich mag TDD;)

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

Dieser Code funktioniert gut.  Expected output

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

Viel Spaß beim Codieren !!