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".
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?
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.
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);
}
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;
}
Le Guava Library has Strings.padStart qui fait exactement ce que vous voulez, avec de nombreux autres utilitaires utiles.
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
l'entrée doit être une chaîne et un nombre
exemple d'entrée: Google 1
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.
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();
}
}
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;)
public static String padString(String Word, int length) {
String newWord = Word;
for(int count = Word.length(); count < length; count++) {
newWord = " " + newWord;
}
return newWord;
}
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 !!