生成固定长度的字符串,填充空格

Raf*_*rja 85 java string formatting

我需要生成固定长度的字符串来生成基于字符位置的文件.缺少的字符必须填充空格字符.

例如,字段CITY具有15个字符的固定长度.输入"芝加哥"和"里约热内卢"的输出是

"        Chicago"
" Rio de Janeiro"
.

Raf*_*rja 114

从Java 1.5开始,我们可以使用方法java.lang.String.format(String,Object ...)并使用类似printf的格式.

格式字符串"%1$15s"完成工作.Where 1$表示参数索引,s表示参数是String并15表示String 的最小宽度.把它们放在一起:"%1$15s".

对于一般方法,我们有:

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

也许有人可以建议另一个格式字符串用特定字符填充空白区域?

  • 根据https://docs.oracle.com/javase/tutorial/essential/io/formatting.html,`1 $`代表参数索引,`15`代表宽度 (5认同)
  • “也许有人可以建议另一个格式字符串来用特定字符填充空白?”-看一下我给出的答案。 (2认同)
  • 这不会限制字符串长度为 15。如果它更长,产生的输出也将超过 15 (2认同)
  • 我应该提到这一点,是的。但我的评论的目的是警告输出可能比期望的更长,这对于固定长度字段可能是一个问题 (2认同)

mik*_*ike 52

利用String.format空格填充并用所需的字符替换它们.

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

打印000Apple.


更新更高性能的版本(因为它不依赖String.format),这对空格没有任何问题(对于Rafael Borja的提示).

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);
Run Code Online (Sandbox Code Playgroud)

打印00New York.

但是需要添加一个检查以防止尝试创建负长度的char数组.


Kur*_*wig 25

此代码将具有给定数量的字符; 填充空格或在右侧截断:

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);
}
Run Code Online (Sandbox Code Playgroud)


Yas*_*gla 11

你也可以写一个简单的方法,如下所示

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

  • 这绝对不是最有效的答案.由于字符串在Java中是不可变的,因此您实际上在内存中生成N个新字符串,其长度等于str.length + 1,因此非常浪费.一个更好的解决方案只会执行一个字符串连接,无论输入字符串长度如何,并在for循环中使用StringBuilder或其他一些更有效的字符串连接方式. (7认同)

Bui*_*goc 11

对于正确的垫你需要String.format("%0$-15s", str) - 标志将做正确的垫非 - 将做左垫

看看我的例子

http://pastebin.com/w6Z5QhnJ

输入必须是字符串和数字

示例输入:Google 1


ano*_*932 10

import org.apache.commons.lang3.StringUtils;

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)
Run Code Online (Sandbox Code Playgroud)

比Guava imo更好的方式.从未见过使用Guava但Apache String Utils的单个企业Java项目非常常见.


jri*_*her 9

番石榴图书馆Strings.padStart,你想要做什么,与其他许多有用的工具一起.


JGF*_*FMK 8

String.format("%15s",s) // pads right
String.format("%-15s",s) // pads left
Run Code Online (Sandbox Code Playgroud)

很棒的总结在这里

  • 翻转了。String.format("%-15s",s) // 向右填充。s="HAMBURGER" 给出“HAMBURGERbbbbbb”,其中“b”= 空格。链接中的内容显示了示例, String s1 = String.format("{%20s}", "Hello Format"); 声明输出是{Hello Format},我同意。就剩下一块垫子了。 (3认同)

Old*_*eon 5

这是一个巧妙的技巧:

// 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();
  }
}
Run Code Online (Sandbox Code Playgroud)