当前位置:  开发笔记 > 编程语言 > 正文

如何在Java中填充字符串?

如何解决《如何在Java中填充字符串?》经验,为你挑选了11个好方法。

是否有一些简单的方法来填充Java中的字符串?

看起来像某些类似于StringUtil的API,但我找不到任何可以做到这一点的东西.



1> RealHowTo..:

从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*


@ Nullw0rm,如果你指的是rgagnon.com,请注意RealHowTo也是rgagnon.com的作者,所以他会把自己归功于......
如果你需要与其他字符(不是空格)的lpad怎么办?String.format仍然可以吗?我无法让它发挥作用......
AFAIK String.format()不能这样做,但编码起来并不困难,请参阅http://www.rgagnon.com/javadetails/java-0448.html(第二个例子)
谢谢你的回答.我有一个疑问,那个'1 $'是什么?@leo做了一个非常相似的答案,不使用`1 $`,它显然具有相同的效果.这有什么不同吗?
至少在我的JVM上,"#"不起作用," - "没问题.(只需删除#).这可能与格式化程序文档一致,我不知道; 它说"'#''\ u0023'要求输出使用另一种形式.表单的定义由转换指定."

2> leo..:

填充到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
  *********


只要我们都记得不传入带空格的字符串......:D
我在@ aboveyou00 - 这对于带空格的字符串来说是一个可怕的解决方案,包括leo提供的示例.在左侧或右侧填充字符串的解决方案不应改变输出中出现的输入字符串,除非输入字符串的原始填充使其超过指定的填充长度.
承认太空问题.`.replace('','*')`更倾向于显示填充的效果.密码隐藏表达式无论如何都没有这个问题...有关使用本机Java功能自定义左右填充字符串的更好答案,请参阅我的其他答案.

3> GaryF..:

阿帕奇StringUtils有几种方法:leftPad,rightPad,centerrepeat.

但请注意 - 正如其他人在本回答中提到并证明的那样- String.format()并且FormatterJDK中的类是更好的选择.在公共代码上使用它们.


java.util.Formatter(和String.format())执行此操作.如果JDK版本完成了这项工作(它确实如此),那么总是更喜欢JDK到外部库.
出于几个原因,我现在更喜欢Guava到Apache Commons; [这个答案显示了如何在番石榴中做到这一点](http://stackoverflow.com/a/7502863/56285).
@ glen3b:对于一个单独的实用程序,就像这些字符串填充助手一样,使用哪个lib确实没什么区别.也就是说,与各种Apache Commons项目(Commons Lang,Commons Collections,Commons IO等)中的对手相比,Guava整体上是一个更现代,更清晰,文档更好的库.它也是由非常聪明的人(Kevin Bourrillion等人)建造的,其中许多人[活跃于SO](http://stackoverflow.com/tags/guava/topusers).我自己几年前最后用Guava替换了各种Apache Commons libs,并且没有后悔.
@ glen3b:好一点[进一步阅读这个问题](http://stackoverflow.com/questions/4542550/what-are-the-big-improvements-between-guava-and-apache-equivalent-libraries).

4> Garrett Hall..:

在番石榴,这很容易:

Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');



5> Shimon Doodk..:

简单的东西:

该值应为字符串.将其转换为字符串,如果不是.喜欢"" + 123Integer.toString(123)

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

子字符串从值长度char索引开始直到填充的结束长度:

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"



6> Arne Burmeis..:

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


请注意,从Java 1.5开始,值得使用StringBuilder而不是StringBuffer.

7> Miserable Va..:

除了Apache Commons之外,还要看String.format哪些应该能够处理简单的填充(例如,使用空格).



8> 小智..:
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...


注意:你倒功能名称; 如果你运行它你会看到.
按照惯例,您不应该使用大写字母表示函数名称.

9> Nthalk..:

我花了一点时间才弄明白.真正的关键是阅读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);



10> 小智..:

我知道这个线程有点陈旧,最初的问题是一个简单的解决方案,但如果它应该非常快,你应该使用一个char数组.

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

会阻止某人的内部缓冲增长.



11> 小智..:

这是另一种填充到右侧的方法:

// put the number of spaces, or any character you like, in your paddedString

String paddedString = "--------------------";

String myStringToBePadded = "I like donuts";

myStringToBePadded = myStringToBePadded + paddedString.substring(myStringToBePadded.length());

//result:
myStringToBePadded = "I like donuts-------";

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有