有没有一种简单的方法在Java中填充字符串?
这似乎是一些类似于StringUtil的API应该有的东西,但我找不到任何可以实现这一点的内容。
自从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*
填充到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
*********
.replace(' ', '*')
的目的是展示填充效果,密码隐藏表达式本身没有这个问题...如果想要更好地定制左右填充字符串,请参考我的另一个答案,使用Java原生特性。 - leoString.format("%30s", "pad left").replaceAll("(?<=( |^)) ", "*")
或 String.format("%-30s", "pad right").replaceAll(" (?=( |$))", "*")
。 - Jaroslaw PawlakStringUtils
/Strings
仍然是更好的选择。 - OrangeDog在 Guava 中,这很容易:
Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');
Guava
源代码中这些方法的实现,这种愚蠢的短路设计几乎让它们无法使用:if (string.length() >= minLength) { return string; }
:( - Dut A.简单内容:
该值应为字符串。如果不是,请将其转换为字符串。例如,使用 "" + 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"
请看org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar)
函数。
但是这个算法非常简单(在右侧填充直到达到给定的长度):
public String pad(String str, int size, char padChar)
{
StringBuilder padded = new StringBuilder(str);
while (padded.length() < size)
{
padded.append(padChar);
}
return padded.toString();
}
String.format
函数,它可以简单地实现填充(例如使用空格)。自Java 11以来,可以使用String.repeat(int)来填充给定字符串的左侧/右侧。
System.out.println("*".repeat(5)+"apple");
System.out.println("apple"+"*".repeat(5));
输出:
*****apple
apple*****
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...
str
进行操作,所以这是正确的。 - mafu(length - str.length())
为 0
时,返回字符串本身的条件是否缺失?当格式化字符串为 %0s
时,格式化程序会引发 FormatFlagsConversionMismatchException
异常。 - Devin Walters
1$
是什么意思?@leo给出了一个非常相似的答案,但没有使用1$
,它似乎具有相同的效果。这会有所区别吗? - Fabrício Matté