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


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 невероятно распространен.



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



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.