Создание строк фиксированной длины, заполненных пробелами

96

Мне нужно создать строку фиксированной длины для создания файла на основе позиции символа. Пропущенные символы должны быть заполнены пробелом.

Например, поле CITY имеет фиксированную длину в 15 символов. Для входов «Чикаго» и «Рио-де-Жанейро» выходы:

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

Рафаэль Борха
источник
это правильный ответ stackoverflow.com/a/38110257/2642478
Xan

Ответы:

125

Начиная с Java 1.5 мы можем использовать метод java.lang.String.format (String, Object ...) и использовать формат, подобный printf.

Строка формата "%1$15s"выполняет свою работу. Где 1$указывает индекс аргумента, sуказывает, что аргумент является строкой и 15представляет минимальную ширину строки. Собираем все вместе: "%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?- взгляните на ответ, который я дал.
Майк,
5
Согласно docs.oracle.com/javase/tutorial/essential/io/formatting.html , 1$представляет индекс аргумента и 15ширину
Дмитрий Минковский,
1
Это не ограничит длину строки 15. Если она длиннее, результат будет также длиннее 15
misterti
1
@misterti строка. подстрока ограничит ее 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 невероятно распространен.

анон58192932
источник
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;)

Палгаз
источник
3
String.format("%15s",s) // pads right
String.format("%-15s",s) // pads left

Отличное резюме здесь

JGFMK
источник
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;
}
hack4greatness
источник
0

У меня работает эта простая функция:

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

Призыв:

String s = leftPad(myString, 10, "0");
WvdHooven
источник