Tạo các chuỗi có độ dài cố định chứa đầy khoảng trắng


95

Tôi cần tạo chuỗi có độ dài cố định để tạo tệp dựa trên vị trí ký tự. Các ký tự bị thiếu phải được điền bằng ký tự khoảng trắng.

Ví dụ: trường CITY có độ dài cố định là 15 ký tự. Đối với đầu vào "Chicago" và "Rio de Janeiro", đầu ra là

"Chicago"
"Rio de Janeiro"
.


đây là câu trả lời chính xác stackoverflow.com/a/38110257/2642478
Xan

Câu trả lời:


122

Kể từ Java 1.5, chúng ta có thể sử dụng phương thức java.lang.String.format (Chuỗi, Đối tượng ...) và sử dụng định dạng printf như.

Chuỗi định dạng "%1$15s"thực hiện công việc. Nơi 1$chỉ ra chỉ số đối số, schỉ ra rằng đối số là một Chuỗi và 15đại diện cho chiều rộng tối thiểu của Chuỗi. Đưa nó tất cả cùng nhau: "%1$15s".

Đối với một phương pháp chung, chúng tôi có:

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

Có lẽ ai đó có thể đề xuất một chuỗi định dạng khác để lấp đầy các khoảng trống bằng một ký tự cụ thể?


2
Maybe someone can suggest another format string to fill the empty spaces with an specific character?- hãy xem câu trả lời mà tôi đã đưa ra.
mike

5
Theo docs.oracle.com/javase/tutorial/essential/io/formatting.html , 1$đại diện cho chỉ số đối số và 15chiều rộng
Dmitry Minkovsky

1
Điều này sẽ không giới hạn chuỗi theo chiều dài 15. Nếu nó dài hơn, sản lượng sản xuất cũng sẽ dài hơn 15
misterti

1
@misterti a string.substring sẽ giới hạn nó ở 15 ký tự. Trân trọng
Rafael Borja

1
Tôi nên đề cập đến điều đó, phải. Nhưng quan điểm bình luận của tôi là để cảnh báo về khả năng đầu ra dài hơn mong muốn, mà có thể là một vấn đề đối với các lĩnh vực chiều dài cố định
misterti

55

Sử dụng phần String.formatđệm của khoảng trắng và thay thế chúng bằng các ký tự mong muốn.

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

Bản in 000Apple.


Cập nhật phiên bản hiệu suất hơn (vì nó không dựa vào String.format), không có vấn đề với dấu cách (gửi cho Rafael Borja để biết gợi ý).

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

Bản in 00New York.

Nhưng cần thêm một dấu kiểm để ngăn việc cố gắng tạo mảng char có độ dài âm.


Mã cập nhật sẽ hoạt động tốt. Đó là những gì tôi mong đợi @thanks mike
sudharsan Chandrasekaran

27

Mã này sẽ có chính xác số lượng ký tự đã cho; đầy khoảng trống hoặc bị cắt ngắn ở phía bên phải:

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

Bạn cũng có thể viết một phương pháp đơn giản như dưới đây

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

8
Đây chắc chắn không phải là câu trả lời hiệu quả nhất. Vì các chuỗi là bất biến trong Java, về cơ bản, bạn đang tạo N chuỗi mới trong bộ nhớ có độ dài bằng str.length + 1 và do đó cực kỳ lãng phí. Một giải pháp tốt hơn nhiều sẽ chỉ thực hiện nối một chuỗi bất kể độ dài chuỗi đầu vào là bao nhiêu và sử dụng StringBuilder hoặc một số cách ghép chuỗi hiệu quả hơn trong vòng lặp for.
anon58192932

12

Đối với đúng pad bạn cần String.format("%0$-15s", str)

tức là -dấu hiệu sẽ "phải" pad và không có -dấu sẽ "trái" pad

xem ví dụ của tôi ở đây

http://pastebin.com/w6Z5QhnJ

đầu vào phải là một chuỗi và một số

ví dụ đầu vào: Google 1


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

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

Tốt hơn Guava imo. Chưa từng thấy một dự án Java doanh nghiệp nào sử dụng Guava nhưng Apache String Utils thì cực kỳ phổ biến.



6

Đây là một mẹo nhỏ:

// 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

Đây là mã với các trường hợp kiểm tra;):

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

Tôi thích TDD;)


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

Tóm tắt tuyệt vời ở đây


1

Mã này hoạt động tuyệt vời. Sản lượng mong đợi

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

Mã hóa vui vẻ !!


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

Chức năng đơn giản này phù hợp với tôi:

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

Lời mời:

String s = leftPad(myString, 10, "0");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.