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

Je dois produire une chaîne de longueur fixe pour générer un fichier basé sur la position des caractères. Les caractères manquants doivent être remplis de caractères d’espacement.

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" 

.

Depuis Java 1.5, nous pouvons utiliser la méthode java.lang.Ssortingng.format (Ssortingng, 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. Rassembler le tout: "%1$15s" .

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

 public static Ssortingng fixedLengthSsortingng(Ssortingng ssortingng, int length) { return Ssortingng.format("%1$"+length+ "s", ssortingng); } 

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?

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

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

Impressions 000Apple .


Mettre à jour la version plus performante (car elle ne repose pas sur Ssortingng.format ), cela n’a pas de problème avec les espaces (merci à Rafael Borja pour le conseil).

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

Imprime 00New York .

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

Ce code aura exactement la quantité de caractères donnée; rempli d’espaces ou tronqué à droite:

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

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

 public static Ssortingng padSsortingng(Ssortingng str, int leng) { for (int i = str.length(); i < = leng; i++) str += " "; return str; } 
 import org.apache.commons.lang3.SsortingngUtils; Ssortingng ssortingngToPad = "10"; int maxPadLength = 10; Ssortingng paddingCharacter = " "; SsortingngUtils.leftPad(ssortingngToPad, maxPadLength, paddingCharacter) 

Bien mieux que Guava imo. Jamais vu un seul projet Java d’entreprise qui utilise Guava, mais Apache Ssortingng Utils est incroyablement commun.

La bibliothèque de goyaves a Ssortingngs.padStart qui fait exactement ce que vous voulez, avec beaucoup d’autres utilitaires utiles.

Pour le pad droit, vous avez besoin de Ssortingng.format("%0$-15s", str) – le signe fera le bon pad non – fera le 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

Voici une astuce:

 // Eg pad("sss","00000000"); should deliver "00000sss". public static Ssortingng pad(Ssortingng ssortingng, Ssortingng pad) { /* * Add the pad to the left of ssortingng then take as many characters from the right * that is the same length as the pad. * This would normally mean starting my subssortingng at * pad.length() + ssortingng.length() - pad.length() but obviously the pad.length()'s * cancel. * * 00000000sss * ^ ----- Cut before this character - pos = 8 + 3 - 8 = 3 */ return (pad + ssortingng).subssortingng(ssortingng.length()); } public static void main(Ssortingng[] args) throws InterruptedException { try { System.out.println("Pad 'Hello' with ' ' produces: '"+pad("Hello"," ")+"'"); // Prints: Pad 'Hello' with ' ' produces: ' Hello' } catch (Exception e) { e.printStackTrace(); } } 

Voici le code avec des cas de tests;):

 @Test public void testNullSsortingngShouldReturnSsortingngWithSpaces() throws Exception { Ssortingng fixedSsortingng = writeAtFixedLength(null, 5); assertEquals(fixedSsortingng, " "); } @Test public void testEmptySsortingngReturnSsortingngWithSpaces() throws Exception { Ssortingng fixedSsortingng = writeAtFixedLength("", 5); assertEquals(fixedSsortingng, " "); } @Test public void testShortSsortingng_ReturnSameSsortingngPlusSpaces() throws Exception { Ssortingng fixedSsortingng = writeAtFixedLength("aa", 5); assertEquals(fixedSsortingng, "aa "); } @Test public void testLongSsortingngShouldBeCut() throws Exception { Ssortingng fixedSsortingng = writeAtFixedLength("aaaaaaaaaa", 5); assertEquals(fixedSsortingng, "aaaaa"); } private Ssortingng writeAtFixedLength(Ssortingng pSsortingng, int lenght) { if (pSsortingng != null && !pSsortingng.isEmpty()){ return getSsortingngAtFixedLength(pSsortingng, lenght); }else{ return completeWithWhiteSpaces("", lenght); } } private Ssortingng getSsortingngAtFixedLength(Ssortingng pSsortingng, 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 

J'aime TDD;)

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

Ce code fonctionne très bien. Production attendue

  Ssortingng ItemNameSpacing = new Ssortingng(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 !!