สร้างสตริงความยาวคงที่ที่เต็มไปด้วยช่องว่าง


100

ฉันต้องการสร้างสตริงที่มีความยาวคงที่เพื่อสร้างไฟล์ตามตำแหน่งอักขระ อักขระที่หายไปต้องเติมด้วยอักขระเว้นวรรค

ตัวอย่างเช่นช่อง CITY มีความยาวคงที่ 15 อักขระ สำหรับอินพุต "Chicago" และ "Rio de Janeiro" เอาต์พุตคือ

"ชิคาโก"
“ ริโอเดจาเนโร”
.


นี่คือคำตอบที่ถูกต้องstackoverflow.com/a/38110257/2642478
Xan

คำตอบ:


129

ตั้งแต่ Java 1.5 เราสามารถใช้เมธอดjava.lang.String.format (String, Object ... )และใช้ printf เหมือนกับรูปแบบ

สตริงรูปแบบ"%1$15s"ทำงาน โดยที่1$ระบุดัชนีอาร์กิวเมนต์sบ่งชี้ว่าอาร์กิวเมนต์เป็น String และ15แสดงถึงความกว้างขั้นต่ำของ String รวมทั้งหมดเข้าด้วยกัน: "%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?- ดูคำตอบที่ฉันให้
ไมค์

5
ตามdocs.oracle.com/javase/tutorial/essential/io/formatting.html , 1$หมายถึงดัชนีการโต้แย้งและ15ความกว้าง
Dmitry Minkovsky

2
สิ่งนี้จะไม่จำกัดความยาวสตริง 15 หากยาวกว่าเอาต์พุตที่ผลิตจะมีความยาวมากกว่า 15
misterti

1
@misterti สตริงย่อยจะ จำกัด ไว้ที่ 15 อักขระ ขอแสดงความนับถือ
Rafael Borja

1
ฉันควรจะพูดถึงเรื่องนั้นใช่ แต่ประเด็นของความคิดเห็นของฉันคือการเตือนเกี่ยวกับความเป็นไปได้ของผลลัพธ์ที่ยาวกว่าที่ต้องการซึ่งอาจเป็นปัญหาสำหรับฟิลด์ความยาวคงที่
misterti

57

ใช้String.formatช่องว่างของช่องว่างและแทนที่ด้วยอักขระที่ต้องการ

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พิมพ์

แต่จำเป็นต้องเพิ่มการตรวจสอบเพื่อป้องกันความพยายามในการสร้างอาร์เรย์ถ่านที่มีความยาวเป็นลบ


รหัสที่อัปเดตจะใช้งานได้ดี นั่นคือสิ่งที่ฉันคาดหวัง @thanks mike
sudharsan chandrasekaran

28

รหัสนี้จะมีอักขระตามจำนวนที่กำหนด เต็มไปด้วยช่องว่างหรือถูกตัดทอนทางด้านขวา:

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

15

สำหรับแผ่นด้านขวาที่คุณต้องการ String.format("%0$-15s", str)

เช่น-เครื่องหมายจะแป้น "ขวา" และไม่มี-เครื่องหมายจะ "ซ้าย" แผ่น

ดูตัวอย่างของฉัน:

import java.util.Scanner;
 
public class Solution {
 
    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("================================");
            for(int i=0;i<3;i++)
            {
                String s1=sc.nextLine();
                
                
                Scanner line = new Scanner( s1);
                line=line.useDelimiter(" ");
               
                String language = line.next();
                int mark = line.nextInt();;
                
                System.out.printf("%s%03d\n",String.format("%0$-15s", language),mark);
                
            }
            System.out.println("================================");
 
    }
}

อินพุตต้องเป็นสตริงและตัวเลข

ตัวอย่างการป้อนข้อมูล: Google 1


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 ดังนั้นจึงเป็นการสิ้นเปลืองอย่างมาก ทางออกที่ดีกว่ามากจะทำการต่อสตริงเพียงชุดเดียวโดยไม่คำนึงถึงความยาวสตริงอินพุตและใช้ StringBuilder หรือวิธีอื่น ๆ ที่มีประสิทธิภาพมากกว่าในการสร้างสตริงใน for loop
anon58192932

@ anon58192932 นี้ดูเหมือนจะไม่เป็นกรณีตั้งแต่ Java 9 openjdk.java.net/jeps/280 , dzone.com/articles/...
patrik

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

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

StringUtils.leftPad(stringToPad, maxPadLength, paddingCharacter)

ดีกว่า Guava imo ไม่เคยเห็นโปรเจ็กต์ Java ขององค์กรเดียวที่ใช้ Guava แต่ 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;)


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

Happy Coding !!


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");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.