Створюйте струни фіксованої довжини, заповнені пробілами


95

Мені потрібно створити рядок фіксованої довжини для створення файлу на основі позиції символу. Відсутні символи повинні бути заповнені пробілом.

Як приклад, поле CITY має фіксовану довжину 15 символів. Для входів "Чикаго" та "Ріо-де-Жанейро" висновки є

"Чикаго"
" Ріо-де-Жанейро"
.


це правильна відповідь stackoverflow.com/a/38110257/2642478
Xan

Відповіді:


122

З Java 1.5 ми можемо використовувати метод java.lang.String.format (String, Object ...) і використовувати формат printf.

Рядок формату "%1$15s"виконує цю роботу. Де 1$вказується індекс аргументу, sвказує, що аргумент є String і 15представляє мінімальну ширину String. Збираємо всі разом: "%1$15s".

Для загального методу ми маємо:

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

Можливо, хтось може запропонувати інший рядок формату для заповнення порожніх просторів певним символом?


2
Maybe someone can suggest another format string to fill the empty spaces with an specific character?- погляньте на відповідь, яку я дав.
mike

5
Відповідно до docs.oracle.com/javase/tutorial/essential/io/formatting.html , 1$представляє індекс аргументу та 15ширину
Дмитро Мінковський

1
Це не обмежить рядок довжиною 15. Якщо вона довша, отриманий вихід також буде довший 15
misterti

1
@misterti a string.substring обмежить його до 15 символів. З найкращими побажаннями
Рафаель Борха

1
Я мав це згадати, так. Але сенс мого коментаря полягав у тому, щоб попередити про можливість виведення довшого часу, ніж бажано, що може бути проблемою для полів фіксованої довжини
misterti

55

Використовуйте String.formatпрокладки пробілами та замінюйте їх потрібним символом.

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

Відбитки 000Apple.


Оновіть більш продуктивну версію (оскільки вона не покладається String.format), яка не має проблем із пробілами (для підказки Рафаелю Борхе).

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

Відбитки 00New York.

Але потрібно додати чек, щоб запобігти спробі створення масиву знаків з негативною довжиною.


Оновлений код буде чудово працювати. Це те, що я очікував @thanks mike
sudharsan chandrasekaran

27

Цей код матиме саме задану кількість символів; заповнені пробілами або усічені з правого боку:

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

12

Ви також можете написати простий метод, як показано нижче

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

8
Це точно не найефективніша відповідь. Оскільки рядки незмінні в Java, ви по суті генеруєте N нових рядків в пам'яті довжиною, що дорівнює str.length + 1, і, отже, дуже марнотратні. Набагато кращим рішенням було б виконати лише одну конкатенацію рядків незалежно від довжини вхідного рядка та використовувати StringBuilder або інший більш ефективний спосіб конатенації рядків у циклі for.
anon58192932

12

Для правої накладки вам потрібно String.format("%0$-15s", str)

тобто -знак буде "правою" майданчиком, а жоден -знак не буде "лівою" майданчиком

див. мій приклад тут

http://pastebin.com/w6Z5QhnJ

введенням повинні бути рядок і число

приклад введення: Google 1


10
import org.apache.commons.lang3.StringUtils;

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

Шлях краще, ніж Гуава Імо. Ніколи не бачив жодного корпоративного проекту Java, який використовує Guava, але Apache String Utils неймовірно поширений.



6

Ось акуратний фокус:

// 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();
  }
}

3

Ось код із тестовими кейсами;):

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

Мені подобається TDD;)


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

Чудовий підсумок тут


1

Цей код чудово працює. Очікуваний вихід

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

Щасливого кодування !!


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

0

Ця проста функція працює для мене:

public static String leftPad(String string, int length, String pad) {
      return pad.repeat(length - string.length()) + string;
    }

Заклик:

String s = leftPad(myString, 10, "0");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.