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


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

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

"        Chicago"
" Rio de Janeiro"
.
11 68

11 ответов:

начиная с Java 1.5 мы можем использовать метод java.ленг.Строка.формат(строка, объект...) и использовать printf как формат.

формат строки "%1s" выполнить задание. Где 1$ указывает индекс аргумента,s - указывает, что аргумент является строкой и 15 представляет минимальную ширину строки. Складывая все это вместе:"%1s".

для общего метода мы имеем:

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

может, кто-то может предложить другой формат строки чтобы заполнить пустые места с определенным символом?

использовать String.formatобивка пробелами и заменить их на нужный символ.

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

печать 000Apple.


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

int width = 10;
char fill = '0';

String toPad = "New York";
String padded = new String(new char[width - toPad.length()]).replace('', fill) + toPad;
System.out.println(padded);

печать 00New York.

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

этот код будет иметь точно заданное количество символов; заполняется пробелами или усекается с правой стороны:

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

вы также можете написать простой метод, как показано ниже

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

The Гуава Библиотека и строки.падстарт что делает именно то, что вы хотите, наряду со многими другими полезностями.

import org.apache.commons.lang3.StringUtils;

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

намного лучше, чем Guava imo. Никогда не видел ни одного проекта enterprise Java, который использует Guava, но Apache String Utils невероятно распространен.

для правой панели вам нужно String.format("%0$-15s", str) - знак будет делать правую площадку не-будет делать левую площадку

посмотреть мой пример здесь

http://pastebin.com/w6Z5QhnJ

ввод должен быть строкой и числом

пример ввода: Google 1

вот ловкий трюк:

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

вот код с тестов ;) :

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

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

этот код работает отлично. Expected output

  String ItemNameSpacing = new String(new char[10 - masterPojos.get(i).getName().length()]).replace('', ' ');
  printData +=  masterPojos.get(i).getName()+ "" + ItemNameSpacing + ":   " + masterPojos.get(i).getItemQty() +" "+ masterPojos.get(i).getItemMeasure() + "\n";

Удачи В Кодировании!!