ฉันจะวางสตริงใน Java ได้อย่างไร


431

มีวิธีง่ายๆในการวาง Strings ใน Java หรือไม่?

ดูเหมือนว่ามีบางสิ่งที่ควรอยู่ใน API คล้าย StringUtil แต่ฉันไม่พบสิ่งใดที่ทำเช่นนี้


ในเรื่องของฟังก์ชั่น apache เทียบกับการจัดรูปแบบสตริงมีข้อสงสัยเล็กน้อยว่าฟังก์ชั่น apache มีความชัดเจนและอ่านง่ายขึ้น การตัดตัวจัดรูปแบบในชื่อฟังก์ชันไม่เหมาะ
Terra Caines

คำตอบ:


189

Apache StringUtilsมีวิธีการหลายวิธี: leftPad, rightPad, และcenterrepeat

แต่โปรดทราบว่า - อย่างที่คนอื่น ๆ พูดถึงและแสดงให้เห็นในคำตอบนี้ - String.format()และFormatterชั้นเรียนใน JDK เป็นตัวเลือกที่ดีกว่า ใช้พวกเขามากกว่ารหัสทั่วไป


91
java.util.Formatter (และ String.format ()) ทำสิ่งนี้ ต้องการให้ JDK เป็นไลบรารีภายนอกเสมอถ้ารุ่น JDK ทำงาน (ซึ่งทำ)
cletus

6
ด้วยเหตุผลหลายประการตอนนี้ฉันชอบ Guava กับ Apache Commons; คำตอบนี้แสดงให้เห็นถึงวิธีการที่จะทำมันในฝรั่ง
Jonik

1
@ Jonik คุณสนใจที่จะระบุเหตุผลของคุณหรือไม่? API มีลักษณะเหมือนกันมาก
glen3b

3
@ glen3b: สำหรับยูทิลิตี้ส่วนบุคคลเช่นตัวช่วยการขยายสายอักขระเหล่านี้มันทำให้ไม่มีความแตกต่างที่ lib ที่จะใช้ ที่กล่าวว่า Guava เป็นภาพรวมที่ทันสมัยสะอาดตาและจัดทำลิสต์ได้ดีกว่าในโครงการ Apache Commons (Commons Lang, Commons Collections, Commons IO และอื่น ๆ ) นอกจากนี้ยังสร้างโดยพวกสมาร์ทจริงๆ (เควิน Bourrillion, et al) หลายคนมีการใช้งานที่ SO ฉันเองก็ลงเอยแทนการแทนที่ libs Apache Commons ด้วย Guava เมื่อหลายปีก่อนและก็ไม่เสียใจ
Jonik


634

ตั้งแต่ 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*

39
ถ้าคุณต้องการ lpad ด้วยตัวอักษรอื่น (ไม่ใช่ที่ว่าง) มันเป็นไปได้ด้วย String.format? ผมไม่สามารถที่จะทำให้การทำงาน ...
กุย

6
AFAIK String.format () ทำไม่ได้ แต่มันไม่ยากเกินไปที่จะเขียนโค้ดดูrgagnon.com/javadetails/java-0448.html (ตัวอย่างที่ 2)
RealHowTo

61
@ Nullw0rm ถ้าคุณหมายถึง rgagnon.com โปรดทราบว่า RealHowTo เป็นผู้แต่ง rgagnon.com ด้วยดังนั้นเขาจะให้เครดิตตัวเอง ...
Colin Pickard

3
อย่างน้อยใน JVM ของฉัน "#" ใช้งานไม่ได้ "-" ใช้ได้ (เพียงลบ #) สิ่งนี้อาจสอดคล้องกับเอกสารฟอร์แมตเตอร์ฉันไม่ได้; มันบอกว่า "'#' '\ u0023' ต้องการเอาท์พุทใช้รูปแบบอื่นคำจำกัดความของรูปแบบถูกระบุโดยการแปลง"
gatoatigrado

6
ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม ฉันมีข้อสงสัยว่าสิ่งที่มีไว้1$เพื่อ? @leo ทำให้คำตอบที่คล้ายกันมากที่ไม่ได้ใช้1$และเห็นได้ชัดว่ามันมีผลเหมือนกัน มันสร้างความแตกต่างหรือไม่?
FabrícioMatté

257

แพ็ดดิงถึง 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
  *********

50
ตราบเท่าที่เราทุกคนจำไม่ได้ที่จะผ่านในสตริงที่มีช่องว่าง ... : D
leviathanbadger

4
ฉันใช้ @ aboveyou00 - นี่เป็นโซลูชันที่น่ากลัวสำหรับสตริงที่มีช่องว่างรวมถึงตัวอย่างที่จัดทำโดยสิงห์ วิธีแก้ปัญหาการขยายสตริงด้านซ้ายหรือด้านขวาไม่ควรเปลี่ยนสตริงอินพุตตามที่ปรากฏในเอาต์พุตยกเว้นว่าการเว้นว่างดั้งเดิมของสตริงอินพุตทำให้เกินความยาวการแพ็ดที่ระบุ
Brian Warshaw

3
รับทราบปัญหาของพื้นที่ .replace(' ', '*')ค่อนข้างตั้งใจจะแสดงผลของการขยาย นิพจน์การซ่อนรหัสผ่านไม่มีปัญหานี้อยู่แล้ว ... เพื่อให้ได้คำตอบที่ดีขึ้นเกี่ยวกับการกำหนดสตริงการแพ็ดด้านซ้ายและขวาโดยใช้คุณสมบัติ Java ดั้งเดิมโปรดดูคำตอบอื่นของฉัน
leo

หากสตริงมีช่องว่างเดียวเท่านั้นและคุณต้องการรองด้วยอักขระที่แตกต่างกันคุณสามารถใช้ regex แทนที่ด้วยดูด้านหลัง / ไปข้างหน้า: String.format("%30s", "pad left").replaceAll("(?<=( |^)) ", "*")หรือString.format("%-30s", "pad right").replaceAll(" (?=( |$))", "*")
Jaroslaw Pawlak


33

บางสิ่งง่าย ๆ :

ค่าควรเป็นสตริง แปลงเป็นสตริงถ้าไม่ใช่ กดไลค์"" + 123หรือInteger.toString(123)

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

ซับสตริงเริ่มต้นจากดัชนีถ่านความยาวค่าจนถึงความยาวท้ายของเบาะ:

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"

24

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

11
โปรดทราบว่าในฐานะของ Java 1.5 มันคุ้มค่าที่จะใช้ StringBuilder แทน StringBuffer
Jon Skeet

21

นอกจาก Apache Commons แล้วดูString.formatว่าควรดูแลช่องว่างภายในที่เรียบง่ายเช่นช่องว่างหรือไม่


17
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...

4
ให้ความสนใจ: คุณกลับชื่อฟังก์ชั่น; ถ้าคุณเรียกใช้คุณจะเห็น
สีน้ำเงิน

บวกถ้า str ดั้งเดิมมีช่องว่างนี่จะไม่ทำงาน
Steven Shaw

@StevenShaw หากฉันไม่เข้าใจผิดการแทนที่ไม่ได้กำหนดเป้าหมายดั้งเดิมstrดังนั้นสิ่งนี้จึงถูกต้อง
mafu

3
ตามแบบแผนคุณไม่ควรใช้อักษรตัวใหญ่สำหรับชื่อฟังก์ชั่น
โดเมนหลักในอุดมคติ

มีเงื่อนไขที่ขาดหายไปกลับสตริงที่เป็นอยู่เมื่อ(length - str.length())เป็น0? ฟอร์แมตเตอร์โยน a FormatFlagsConversionMismatchExceptionเมื่อ%0sเป็นสตริงรูปแบบ
Devin Walters

7

ฉันใช้เวลาสักครู่เพื่อคิดออก กุญแจสำคัญคือการอ่านเอกสารของฟอร์แมตเตอร์

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

ทำไมจุดจบจึงซับซ้อน? คุณสามารถทำเสร็จแล้ว String hex = String.format ("% 032x", ไดเจสต์); และมีผลลัพธ์เหมือนกันโดยไม่ต้องแทนที่ () โดยไม่จำเป็นและต้องใช้ $ เพื่อเข้าถึงตัวแปรเฉพาะ (มีเพียงอันเดียวหลังจากนั้นทั้งหมด)
ArtOfWarfare

@ArtOfWarfare จุดยุติธรรม แต่เดิมมีคนถามถึงการเติมค่าเลขฐานสิบหกในคำถามอื่นฉันเห็นว่าฉันมีลิงก์ไปยังเอกสารของฟอร์แมตเตอร์ มันซับซ้อนเพื่อความสมบูรณ์
Nthalk

6

ฉันรู้ว่ากระทู้นี้เก่าและคำถามเดิมมีไว้เพื่อแก้ปัญหาที่ง่าย แต่ถ้ามันควรจะเร็วจริง ๆ คุณควรใช้อาร์เรย์ 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);

จะป้องกันไม่ให้บัฟเฟอร์ภายในของ sb เติบโตขึ้น


หากStringBufferไม่สามารถเข้าถึงหลายเธรดได้พร้อมกัน (ซึ่งในกรณีนี้เป็นจริง) คุณควรใช้StringBuilder(ใน JDK1.5 +) เพื่อหลีกเลี่ยงค่าใช้จ่ายในการซิงโครไนซ์
glen3b

5

นี่เป็นอีกวิธีในการปัดไปทางขวา:

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

5

ตั้งแต่ Java 11, String.repeat (int) สามารถใช้ในการซ้าย / ขวา pad ของสตริงที่กำหนด

System.out.println("*".repeat(5)+"apple");
System.out.println("apple"+"*".repeat(5));

เอาท์พุท:

*****apple
apple*****

1
คำตอบที่ดีที่สุดสำหรับ java 11!
Nagy Attila

4

คุณสามารถลดค่าใช้จ่ายต่อการโทรได้โดยเก็บข้อมูลการเติมแทนที่จะสร้างใหม่ทุกครั้ง:

public class RightPadder {

    private int length;
    private String padding;

    public RightPadder(int length, String pad) {
        this.length = length;
        StringBuilder sb = new StringBuilder(pad);
        while (sb.length() < length) {
            sb.append(sb);
        }
        padding = sb.toString();
   }

    public String pad(String s) {
        return (s.length() < length ? s + padding : s).substring(0, length);
    }

}

คุณสามารถกำหนดความยาวผลลัพธ์เป็นพารามิเตอร์ให้กับpad(...)เมธอดได้ ในกรณีนั้นทำการปรับค่า padding ที่ซ่อนอยู่ในเมธอดนั้นแทนใน constructor

(คำแนะนำ: สำหรับเครดิตเพิ่มเติมให้ใช้ thread-safe! ;-)


1
นั่นคือเธรดที่ปลอดภัยยกเว้นการเผยแพร่ที่ไม่ปลอดภัย (ทำให้ฟิลด์ของคุณเป็นที่สิ้นสุดตามหลักสูตร) ฉันคิดว่าการปรับปรุงจะดีขึ้นด้วยการทำซับสตริงก่อนเครื่องหมาย + ซึ่งควรแทนที่ด้วย concat (ค่อนข้างแปลก)
Tom Hawtin - tackline


2

คุณสามารถใช้เมธอด StringBuilder ผนวก () และ insert () ในตัวสำหรับการเสริมความยาวของตัวแปรสตริง:

AbstractStringBuilder append(CharSequence s, int start, int end) ;

ตัวอย่างเช่น:

private static final String  MAX_STRING = "                    "; //20 spaces

    Set<StringBuilder> set= new HashSet<StringBuilder>();
    set.add(new StringBuilder("12345678"));
    set.add(new StringBuilder("123456789"));
    set.add(new StringBuilder("1234567811"));
    set.add(new StringBuilder("12345678123"));
    set.add(new StringBuilder("1234567812234"));
    set.add(new StringBuilder("1234567812222"));
    set.add(new StringBuilder("12345678122334"));

    for(StringBuilder padMe: set)
        padMe.append(MAX_STRING, padMe.length(), MAX_STRING.length());

2

งานนี้:

"".format("%1$-" + 9 + "s", "XXX").replaceAll(" ", "0")

มันจะเติมสตริง XXX ของคุณมากถึง 9 Chars ด้วยช่องว่าง หลังจากนั้นช่องว่างทั้งหมดจะถูกแทนที่ด้วย 0 คุณสามารถเปลี่ยนช่องว่างและ 0 เป็นสิ่งที่คุณต้องการ ...


คุณควรเรียกใช้staticเมธอดString.format(…)แทนการใช้สตริงที่ไม่เหมาะสม การบันทึกอักขระสี่ตัวในซอร์สโค้ดย่อมไม่คุ้มกับการสูญเสียความสามารถในการอ่าน
Holger

2
public static String padLeft(String in, int size, char padChar) {                
    if (in.length() <= size) {
        char[] temp = new char[size];
        /* Llenado Array con el padChar*/
        for(int i =0;i<size;i++){
            temp[i]= padChar;
        }
        int posIniTemp = size-in.length();
        for(int i=0;i<in.length();i++){
            temp[posIniTemp]=in.charAt(i);
            posIniTemp++;
        }            
        return new String(temp);
    }
    return "";
}

2

ให้ฉันออกคำตอบสำหรับบางกรณีที่คุณต้องให้ padding ซ้าย / ขวา (หรือคำนำหน้า / สตริงหรือช่องว่าง) ก่อนที่คุณจะเชื่อมต่อกับสตริงอื่นและคุณไม่ต้องการทดสอบความยาวหรือเงื่อนไขใด ๆ ถ้า

เหมือนกับคำตอบที่เลือกฉันต้องการStringUtilsApache ของ Commons แต่ใช้วิธีนี้:

StringUtils.defaultString(StringUtils.leftPad(myString, 1))

อธิบาย:

  • myString: สตริงที่ฉันป้อนเข้าอาจเป็นโมฆะ
  • StringUtils.leftPad(myString, 1): ถ้า string เป็นโมฆะประโยคนี้จะคืนค่า null เช่นกัน
  • จากนั้นใช้defaultStringเพื่อให้สตริงที่ว่างเปล่าเพื่อป้องกันการเชื่อมต่อที่ว่าง

2

@ck 's และ@Marlon Tarak ' s คำตอบเป็นคนเดียวที่จะใช้char[]ซึ่งสำหรับการใช้งานที่มีหลายสายวิธีการขยายต่อวินาทีเป็นวิธีที่ดีที่สุด อย่างไรก็ตามพวกเขาไม่ได้ใช้ประโยชน์จากการเพิ่มประสิทธิภาพการจัดการอาเรย์ใด ๆ และถูกเขียนทับเล็กน้อยสำหรับรสนิยมของฉัน สามารถทำได้โดยไม่ต้องวนซ้ำเลย

public static String pad(String source, char fill, int length, boolean right){
    if(source.length() > length) return source;
    char[] out = new char[length];
    if(right){
        System.arraycopy(source.toCharArray(), 0, out, 0, source.length());
        Arrays.fill(out, source.length(), length, fill);
    }else{
        int sourceOffset = length - source.length();
        System.arraycopy(source.toCharArray(), 0, out, sourceOffset, source.length());
        Arrays.fill(out, 0, sourceOffset, fill);
    }
    return new String(out);
}

วิธีทดสอบอย่างง่าย:

public static void main(String... args){
    System.out.println("012345678901234567890123456789");
    System.out.println(pad("cats", ' ', 30, true));
    System.out.println(pad("cats", ' ', 30, false));
    System.out.println(pad("cats", ' ', 20, false));
    System.out.println(pad("cats", '$', 30, true));
    System.out.println(pad("too long for your own good, buddy", '#', 30, true));
}

ขาออก:

012345678901234567890123456789
cats                          
                          cats
                cats
cats$$$$$$$$$$$$$$$$$$$$$$$$$$
too long for your own good, buddy 

1
คุณสามารถใช้getCharsเพื่อให้Stringคัดลอกเนื้อหาโดยตรงในoutอาร์เรย์แทนการโทรตามsource.toCharArray() System.arraycopyฉันยังต้องการพิจารณาลดความซับซ้อนของการดำเนินการเพื่อchar[] out = new char[length]; Arrays.fill(out, 0, length, fill); source.getChars(0, source.length(), out, right? 0: length - source.length()); return new String(out);; ในขณะที่สิ่งนี้ดูเหมือนว่าfillจะทำงานได้มากขึ้นจริง ๆ แล้วมันอนุญาตให้ JVM กำจัดค่าเริ่มต้นการเติมศูนย์
Holger

1

java.util.Formatterจะทำซ้ายและขวา padding ไม่จำเป็นต้องพึ่งพาบุคคลที่สามที่แปลก (คุณต้องการเพิ่มพวกเขาสำหรับสิ่งที่ไม่สำคัญ)

[ฉันได้ละรายละเอียดและทำให้โพสต์นี้เป็น 'ชุมชน wiki' เนื่องจากไม่ใช่สิ่งที่ฉันต้องการ]


4
ฉันไม่เห็นด้วย. ในโครงการ Java ที่มีขนาดใหญ่กว่าปกติแล้วคุณจะทำการจัดการกับ String จำนวนมากเช่นนั้นการเพิ่มความสามารถในการอ่านและหลีกเลี่ยงข้อผิดพลาดนั้นคุ้มค่ามากเมื่อใช้ Apache Commons Lang คุณทุกคนรู้รหัสเช่น someString.subString (someString.indexOf (startCharacter), someString.lastIndexOf (endCharacter)) ซึ่งสามารถหลีกเลี่ยงได้อย่างง่ายดายด้วย StringUtils
Bananeweizen

1

การดำเนินการสตริงทั้งหมดมักจะต้องมีประสิทธิภาพมาก - โดยเฉพาะถ้าคุณทำงานกับชุดข้อมูลขนาดใหญ่ ฉันต้องการสิ่งที่รวดเร็วและยืดหยุ่นคล้ายกับสิ่งที่คุณจะได้รับในคำสั่ง plsql pad นอกจากนี้ฉันไม่ต้องการรวม lib ขนาดใหญ่สำหรับสิ่งเล็ก ๆ เพียงหนึ่ง ด้วยการพิจารณาเหล่านี้ไม่มีการแก้ปัญหาเหล่านี้เป็นที่น่าพอใจ นี่คือวิธีแก้ไขปัญหาที่ฉันนำเสนอซึ่งมีผลลัพธ์ที่ดีที่สุดหากใครก็ตามสามารถปรับปรุงได้โปรดเพิ่มความคิดเห็นของคุณ

public static char[] lpad(char[] pStringChar, int pTotalLength, char pPad) {
    if (pStringChar.length < pTotalLength) {
        char[] retChar = new char[pTotalLength];
        int padIdx = pTotalLength - pStringChar.length;
        Arrays.fill(retChar, 0, padIdx, pPad);
        System.arraycopy(pStringChar, 0, retChar, padIdx, pStringChar.length);
        return retChar;
    } else {
        return pStringChar;
    }
}
  • ทราบว่ามันถูกเรียกด้วย String.toCharArray () และผลที่ได้สามารถแปลงเป็นสตริงที่มีผลสตริงใหม่ ((ถ่าน [])) เหตุผลสำหรับเรื่องนี้คือถ้าคุณใช้การดำเนินการหลายอย่างคุณสามารถทำได้ทั้งหมดใน char [] และไม่ทำการแปลงระหว่างรูปแบบ - เบื้องหลัง, String จะถูกเก็บเป็น char [] หากการดำเนินการเหล่านี้รวมอยู่ในคลาส String เองจะมีประสิทธิภาพเป็นสองเท่า - ความเร็วและหน่วยความจำที่ชาญฉลาด

นี่ดูเหมือนเป็นวิธีที่มีประสิทธิภาพมากที่สุด
David Lilljegren

1

ใช้ฟังก์ชั่นนี้

private String leftPadding(String word, int length, char ch) {
   return (length > word.length()) ? leftPadding(ch + word, length, ch) : word;
}

วิธีใช้?

leftPadding(month, 2, '0');

เอาท์พุท: 01 02 03 04 .. 11 12


1

ผู้คนจำนวนมากมีเทคนิคที่น่าสนใจ แต่ฉันชอบที่จะทำให้มันง่ายดังนั้นฉันจะไปกับสิ่งนี้:

public static String padRight(String s, int n, char padding){
    StringBuilder builder = new StringBuilder(s.length() + n);
    builder.append(s);
    for(int i = 0; i < n; i++){
        builder.append(padding);
    }
    return builder.toString();
}

public static String padLeft(String s, int n,  char padding) {
    StringBuilder builder = new StringBuilder(s.length() + n);
    for(int i = 0; i < n; i++){
        builder.append(Character.toString(padding));
    }
    return builder.append(s).toString();
}

public static String pad(String s, int n, char padding){
    StringBuilder pad = new StringBuilder(s.length() + n * 2);
    StringBuilder value = new StringBuilder(n);
    for(int i = 0; i < n; i++){
        pad.append(padding);
    }
    return value.append(pad).append(s).append(pad).toString();
}

2
นี่ไม่มีประสิทธิภาพมากคุณควรใช้ StringBuilder
wkarl

เมื่อคุณทราบความยาวแล้วคุณควรบอก StringBuilder ให้จัดสรรพื้นที่ว่างนั้นเมื่อคุณสร้างอินสแตนซ์
Ariel

@Ariel น่าสนใจที่คุณพูดถึงเพราะฉันเพิ่งพูดคุยกับคนอื่นเกี่ยวกับวันนี้ฮ่า ๆ
Aelphaeis

0

วิธีง่ายๆที่ไม่มี API ใด ๆจะเป็นดังนี้:

public String pad(String num, int len){
    if(len-num.length() <=0) return num;
    StringBuffer sb = new StringBuffer();
    for(i=0; i<(len-num.length()); i++){
        sb.append("0");
    }
    sb.append(num);
    return sb.toString();
}

0

Java oneliners ไม่มีไลบรารี่ที่น่าสนใจ

// 6 characters padding example
String pad = "******";
// testcases for 0, 4, 8 characters
String input = "" | "abcd" | "abcdefgh"

ผัดซ้ายไม่ จำกัด

result = pad.substring(Math.min(input.length(),pad.length())) + input;
results: "******" | "**abcd" | "abcdefgh"

ผัดขวาไม่ จำกัด

result = input + pad.substring(Math.min(input.length(),pad.length()));
results: "******" | "abcd**" | "abcdefgh"

Pad Left, จำกัดความยาวของ pad

result = (pad + input).substring(input.length(), input.length() + pad.length());
results: "******" | "**abcd" | "cdefgh"

ขวา Pad จำกัดความยาวของแผ่น

result = (input + pad).substring(0, pad.length());
results: "******" | "abcd**" | "abcdef"

0

ใช้การสอบถามซ้ำได้อย่างไร โซลูชันที่ระบุด้านล่างสามารถทำงานร่วมกับ JDK ทุกรุ่นและไม่ต้องใช้ไลบรารีภายนอก :)

private static String addPadding(final String str, final int desiredLength, final String padBy) {
        String result = str;
        if (str.length() >= desiredLength) {
            return result;
        } else {
            result += padBy;
            return addPadding(result, desiredLength, padBy);
        }
    }

หมายเหตุ : วิธีการนี้จะผนวกการเติมด้วยการปรับแต่งเล็กน้อยคุณสามารถเติมค่าของแผ่นนำหน้าได้


0

นี่เป็นเวอร์ชั่นคู่ขนานสำหรับพวกคุณที่มีเงื่อนไข จำกัด :-)

int width = 100;
String s = "129018";

CharSequence padded = IntStream.range(0,width)
            .parallel()
            .map(i->i-(width-s.length()))
            .map(i->i<0 ? '0' :s.charAt(i))
            .collect(StringBuilder::new, (sb,c)-> sb.append((char)c), (sb1,sb2)->sb1.append(sb2));

0

-1

ทางออกที่ง่ายจะเป็น:

package nl;
public class Padder {
    public static void main(String[] args) {
        String s = "123" ;
        System.out.println("#"+("     " + s).substring(s.length())+"#");
    }
}

-1

เป็นอย่างไรบ้าง

สตริงคือ "hello" และการเติมที่จำเป็นคือ 15 โดยใช้แผ่นซ้าย "0"

String ax="Hello";
while(ax.length() < 15) ax="0"+ax;

10
อันนี้สร้างมากถึง 15 สายใหม่
claj

@claj ใช่ แต่นี้
ruffin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.