web-dev-qa-db-fra.com

Générer des chaînes de longueur fixe remplies d'espaces

Je dois produire une chaîne de longueur fixe pour générer un fichier basé sur la position du caractère. Les caractères manquants doivent être remplis avec un espace. 

Par exemple, le champ CITY a une longueur fixe de 15 caractères. Pour les entrées "Chicago" et "Rio de Janeiro", les sorties sont

"Chicago" 
 "Rio de Janeiro"
.

74
Rafael Borja

Depuis Java 1.5, nous pouvons utiliser la méthode Java.lang.String.format (String, Object ...) et utiliser le format printf.

La chaîne de format "%1$15s" fait le travail. Où 1$ indique l'index de l'argument, s indique que l'argument est une chaîne et 15 représente la largeur minimale de la chaîne . Assembler tous ces éléments: "%1$15s".

Pour une méthode générale, nous avons:

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

Peut-être que quelqu'un peut suggérer une autre chaîne de format pour remplir les espaces vides avec un caractère spécifique?

104
Rafael Borja

Utilisez le remplissage de String.format avec des espaces et remplacez-les par le caractère souhaité.

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

Imprime 000Apple.


Mise à jour version plus performante (puisqu'elle ne repose pas sur String.format), qui n'a pas de problème d'espaces (merci à Rafael Borja pour le conseil).

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

Imprime 00New York.

Cependant, une vérification doit être ajoutée pour empêcher la création d'un tableau de caractères de longueur négative.

45
mike

Ce code aura exactement la quantité donnée de caractères; rempli d'espaces ou tronqué du côté droit:

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

Vous pouvez également écrire une méthode simple comme ci-dessous

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

Le Guava Library has Strings.padStart qui fait exactement ce que vous voulez, avec de nombreux autres utilitaires utiles. 

9
jricher

Pour le pad droit, vous avez besoin du signe String.format("%0$-15s", str)- qui fera du pad droit non - du pad gauche

voir mon exemple ici 

http://Pastebin.com/w6Z5QhnJ

l'entrée doit être une chaîne et un nombre 

exemple d'entrée: 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)

Bien mieux que Guava Imo. Jamais vu un seul projet d'entreprise Java utilisant Guava, mais Apache String Utils est incroyablement commun.

8
anon58192932

Voici une astuce intéressante:

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

Voici le code avec les cas de tests;):

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

J'aime 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

Ce code fonctionne très bien.  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";

Bonne codage !!