Как я могу дополнить строку в Java? - PullRequest
388 голосов
/ 23 декабря 2008

Есть ли какой-нибудь простой способ дополнить строки в Java?

Похоже, что-то должно быть в каком-то StringUtil-подобном API, но я не могу найти ничего, что делает это.

Ответы [ 27 ]

583 голосов
/ 24 декабря 2008

Поскольку Java 1.5, String.format() может использоваться для левой / правой панели заданной строки.

public static String padRight(String s, int n) {
     return String.format("%-" + n + "s", s);  
}

public static String padLeft(String s, int n) {
    return String.format("%" + n + "s", s);  
}

...

public static void main(String args[]) throws Exception {
 System.out.println(padRight("Howto", 20) + "*");
 System.out.println(padLeft("Howto", 20) + "*");
}

И вывод:

Howto               *
               Howto*
241 голосов
/ 31 мая 2011

Заполнение до 10 символов:

String.format("%10s", "foo").replace(' ', '*');
String.format("%-10s", "bar").replace(' ', '*');
String.format("%10s", "longer than 10 chars").replace(' ', '*');

выход:

  *******foo
  bar*******
  longer*than*10*chars

Отображение '*' для символов пароля:

String password = "secret123";
String padded = String.format("%"+password.length()+"s", "").replace(' ', '*');

длина вывода равна длине строки пароля:

  secret123
  *********
167 голосов
/ 23 декабря 2008

Apache StringUtils имеет несколько методов: leftPad, rightPad, center и repeat.

Но учтите, что - как уже упоминалось и продемонстрировано в этот ответ - String.format() и классы Formatter в JDK являются лучшими вариантами. Используйте их поверх общего кода.

86 голосов
/ 21 сентября 2011

В Гуава , это просто:

Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');
30 голосов
/ 02 сентября 2013

Что-то простое:

Значение должно быть строкой. преобразовать его в строку, если это не так. Как "" + 123 или Integer.toString(123)

// let's assume value holds the String we want to pad
String value = "123";

Начало подстроки от индекса длины значения до конечной длины дополнения:

String padded="00000000".substring(value.length()) + value;

// now padded is "00000123"

Точнее

колодка справа:

String padded = value + ("ABCDEFGH".substring(value.length())); 

// now padded is "123DEFGH"

накладка слева:

String padString = "ABCDEFGH";
String padded = (padString.substring(0, padString.length() - value.length())) + value;

// now padded is "ABCDE123"
22 голосов
/ 23 декабря 2008

Посмотрите на org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar).

Но алгоритм очень прост (отступ до размера символов):

public String pad(String str, int size, char padChar)
{
  StringBuffer padded = new StringBuffer(str);
  while (padded.length() < size)
  {
    padded.append(padChar);
  }
  return padded.toString();
}
21 голосов
/ 23 декабря 2008

Кроме Apache Commons, см. Также String.format, который должен быть в состоянии позаботиться о простом заполнении (например, пробелами).

16 голосов
/ 09 февраля 2012
public static String LPad(String str, Integer length, char car) {
  return (str + String.format("%" + length + "s", "").replace(" ", String.valueOf(car))).substring(0, length);
}

public static String RPad(String str, Integer length, char car) {
  return (String.format("%" + length + "s", "").replace(" ", String.valueOf(car)) + str).substring(str.length(), length + str.length());
}

LPad("Hi", 10, 'R') //gives "RRRRRRRRHi"
RPad("Hi", 10, 'R') //gives "HiRRRRRRRR"
RPad("Hi", 10, ' ') //gives "Hi        "
RPad("Hi", 1, ' ')  //gives "H"
//etc...
7 голосов
/ 30 октября 2010

Мне понадобилось немного времени, чтобы понять. Настоящим ключом является чтение этой документации Formatter.

// Get your data from wherever.
final byte[] data = getData();
// Get the digest engine.
final MessageDigest md5= MessageDigest.getInstance("MD5");
// Send your data through it.
md5.update(data);
// Parse the data as a positive BigInteger.
final BigInteger digest = new BigInteger(1,md5.digest());
// Pad the digest with blanks, 32 wide.
String hex = String.format(
    // See: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
    // Format: %[argument_index$][flags][width]conversion
    // Conversion: 'x', 'X'  integral    The result is formatted as a hexadecimal integer
    "%1$32x",
    digest
);
// Replace the blank padding with 0s.
hex = hex.replace(" ","0");
System.out.println(hex);
6 голосов
/ 28 октября 2010

я знаю, что эта ветка довольно старая, и исходный вопрос был для простого решения, но если он должен быть очень быстрым, вы должны использовать массив символов.

public static String pad(String str, int size, char padChar)
{
    if (str.length() < size)
    {
        char[] temp = new char[size];
        int i = 0;

        while (i < str.length())
        {
            temp[i] = str.charAt(i);
            i++;
        }

        while (i < size)
        {
            temp[i] = padChar;
            i++;
        }

        str = new String(temp);
    }

    return str;
}

решение для форматирования не является оптимальным. просто построение строки формата создает 2 новые строки.

Решение apache можно улучшить, инициализируя sb с целевым размером, поэтому замените его ниже

StringBuffer padded = new StringBuffer(str); 

с

StringBuffer padded = new StringBuffer(pad); 
padded.append(value);

будет препятствовать росту внутреннего буфера sb.

...