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


Answers:


122

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

格式字符串可以"%1$15s"完成这项工作。其中1$表示参数索引,s表示参数是字符串,并且15表示字符串的最小宽度。全部放在一起:"%1$15s"

对于一般方法,我们有:

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

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


2
Maybe someone can suggest another format string to fill the empty spaces with an specific character?-看一下我给的答案。
Mike

5
根据docs.oracle.com/javase/tutorial/essential/io/formatting.html1$表示参数索引和15宽度
Dmitry

1
这不会将字符串的长度限制为15。如果较长,则输出的结果也将大于15
misterti

1
@misterti一个string.substring会将其限制为15个字符。最好的问候
拉斐尔·博尔贾

1
我应该提到,是的。但是我的评论的目的是警告可能会有输出超出期望的时间的问题,这对于固定长度的字段可能是个问题
misterti

55

使用String.format带有空格的填充,然后将其替换为所需的char。

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

印刷品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);

印刷品00New York

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


更新的代码会很好用。我所期望的@谢谢迈克
sudharsan chandrasekaran '17

27

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

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

12

您还可以编写如下的简单方法

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

8
这绝对不是最有效的答案。由于字符串在Java中是不可变的,因此您实际上是在内存中生成N个新字符串,其长度等于str.length + 1,因此非常浪费。更好的解决方案将仅执行一个字符串串联,而不管输入字符串的长度如何,并在for循环中利用StringBuilder或其他更有效的字符串串联方式。
anon58192932

12

对于右垫,您需要 String.format("%0$-15s", str)

-标志将“右”垫,没有-标志将“左”垫

在这里看到我的例子

http://pastebin.com/w6Z5QhnJ

输入必须是字符串和数字

输入示例:Google 1


10
import org.apache.commons.lang3.StringUtils;

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

比番石榴imo更好。从未见过使用Guava的单个企业Java项目,但是Apache String Utils非常常见。



6

这是一个巧妙的把戏:

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

3

这是带有测试用例的代码;):

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


2
String.format("%15s",s) // pads right
String.format("%-15s",s) // pads left

大汇总这里


1

这段代码很棒。 预期产量

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

快乐编码!


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

0

这个简单的功能对我有用:

public static String leftPad(String string, int length, String pad) {
      return pad.repeat(length - string.length()) + string;
    }

调用方式:

String s = leftPad(myString, 10, "0");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.