Generowanie ciągów o stałej długości wypełnionych spacjami


Muszę utworzyć ciąg o stałej długości, aby wygenerować plik na podstawie pozycji znaku. Brakujące znaki należy wypełnić spacją.
Na przykład pole CITY ma stałą długość 15 znaków. Do wejść „Chicago” i „Rio de Janeiro” wychodzi
" Chicago"
" Rio de Janeiro"
.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Od Java 1.5 możemy korzystać z metody

java.lang.String.format (String, Object...)
http://docs.oracle.com/javase/ ... ocale,%20java.lang.String,%20java.lang.Object...%29
i użyj printf jako formatu.
Ciąg formatu
"% 1 $ 15s"
wykonuje zadanie. Gdzie
1 $
wskazuje indeks argumentu,
s
wskazuje, że argument jest ciągiem, a
15
reprezentuje minimalną szerokość ciągu.
Wszystko razem:
„% 1 $ 15s”
.
W przypadku metody ogólnej mamy:
public static String fixedLengthString(String string, int length) {
return String.format("%1$"+length+ "s", string);
}

Może ktoś może zasugerować inny ciąg formatujący, aby wypełnić puste miejsca określonym znakiem?
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyj dopełnienia
String.format
spacjami i zastąp je odpowiednim znakiem.
String toPad = "Apple";
String padded = String.format("%8s", toPad).replace(' ', '0');
System.out.println(padded);

Wydruki
000Apple
.

Aktualizacja

bardziej wydajna wersja (ponieważ nie opiera się na
String.format
), która nie ma problemu ze spacjami (dzięki Rafaelowi Borge za podpowiedź).
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);

Wydruki
00New York
.
Ale musisz dodać czek, aby uniemożliwić tworzenie tablicy znaków o ujemnej długości.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ten kod będzie miał dokładnie określoną liczbę znaków; wypełnione spacjami lub obcięte po prawej stronie:
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);
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz także napisać prostą metodę, jak poniżej
public static String padString(String str, int leng) {
for (int i = str.length(); i <= leng; i++)
str += " ";
return str;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Do prawego pola potrzebujesz
String.format ("% 0 $ -15s", str)
to znaczy, że znak
-
będzie „prawym” dywanikiem, a żadne znaki
-
będą „lewym” dywanikiem
zobacz mój przykład tutaj
http://pastebin.com/w6Z5QhnJ
http://pastebin.com/w6Z5QhnJ
dane wejściowe muszą być ciągiem i liczbą
przykładowe wejście: google 1
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W

Biblioteka Guava
https://github.com/google/guava/wiki
jest

Strings.padStart
https://google.github.io/guava ... char-
który robi dokładnie to, czego chcesz, wraz z wieloma innymi przydatnymi narzędziami.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

import org.apache.commons.lang3.StringUtils;String stringToPad = "10";
int maxPadLength = 10;
String paddingCharacter = " ";StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

Znacznie lepiej niż IMO guawa. Nigdy nie widziałem ani jednego projektu korporacyjnego w Javie, który używa guawy, ale narzędzia liniowe Apache są powszechne.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto zgrabna sztuczka:
// 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();
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto kod z przypadkami testowymi;):
@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;
}

Lubię TDD;)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

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

Świetne CV

tutaj
https://www.journaldev.com/178 ... ample
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ten kod działa świetnie.
https://i.stack.imgur.com/u9lmy.png
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";

Miłego kodowania !!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

public static String padString(String word, int length) {
String newWord = word;
for(int count = word.length(); count < length; count++) {
newWord = " " + newWord;
}
return newWord;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ta prosta funkcja działa dla mnie:
public static String leftPad(String string, int length, String pad) {
return pad.repeat(length - string.length()) + string;
}

Połączenie:
String s = leftPad(myString, 10, "0");

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się