Làm thế nào để định dạng một chuỗi Java với số 0 đứng đầu?


191

Đây là Chuỗi, ví dụ:

"Apple"

và tôi muốn thêm số không để điền vào 8 ký tự:

"000Apple"

Làm thế nào tôi có thể làm như vậy?

Câu trả lời:


287

Trong trường hợp bạn phải làm điều đó mà không cần sự trợ giúp của thư viện:

("00000000" + "Apple").substring("Apple".length())

(Hoạt động, miễn là Chuỗi của bạn không dài hơn 8 ký tự.)


21
Điều đó khá thông minh - nhưng tôi mất khoảng 30 giây để "hiểu". Tôi nghĩ rằng một giải pháp dễ đọc hơn sẽ tốt hơn.
Amy B

2
Đây là một giải pháp tuyệt vời khi bạn nhúng phần mềm vào thứ gì đó mà không có nhiều dung lượng và các thư viện bổ sung không phải là một tùy chọn. Cảm ơn!!
Casey Murray

Phiên bản này là điên nhanh! Tôi thích nó.
Dakkaron

2
@Mathu thật lòng mà không khó hiểu. Hai chuỗi được nối (nối với nhau) và 5 ký tự đầu tiên được trích xuất từ ​​nó. Không có phép thuật. Không hợp lý lắm trong trường hợp này (đối với Apple chuỗi cố định) nhưng dễ hiểu. ("0000" + theString).substring(theString.length())là thực tế hơn. Miếng đệm này theStringvới số không hàng đầu. Xin lỗi không thể cưỡng lại việc thêm nhận xét này :)
HankCa

1
Giải pháp này có một cú pháp ngắn nhưng nó không "điên nhanh". Nếu bạn may mắn, trình biên dịch sẽ tối ưu hóa nó nhưng về cơ bản, cách "nhanh" thực sự để làm điều này là sử dụng một StringBuilder, và phải mất một vòng lặp để điền vào nó. Nếu yêu cầu thực sự là chỉ cắt các chuỗi 8 ký tự thì không sao, mặc dù đó là trường hợp sử dụng rất hẹp, nhưng giải pháp này không bao giờ có thể được gọi là nhanh. Nó chỉ là ngắn.
Dici

319
public class LeadingZerosExample {
    public static void main(String[] args) {
       int number = 1500;

       // String format below will add leading zeros (the %0 syntax) 
       // to the number above. 
       // The length of the formatted string will be 7 characters.

       String formatted = String.format("%07d", number);

       System.out.println("Number with leading zeros: " + formatted);
    }
}

14
nhưng tôi muốn thêm số 0 đứng đầu trước một chuỗi thay vì int.
Roy

1
Bạn có thể sử dụng StringUtils hoặc DecimalFormat cho Java 1.4 trở xuống. Kiểm tra tại đây javadevnotes.com/java-integer-to-opes-with-lead-zeros
JavaDev

3
@Variag sử dụng %07s thay vì %07d, bạn sẽ nhận được a FormatFlagsConversionMismatchException. bạn có thể thử nó
Z fp

127
 StringUtils.leftPad(yourString, 8, '0');

Đây là từ commons-lang . Xem javadoc


3
Tại sao không sử dụng commons-lang? Nó có một loạt các tính năng bổ sung hữu ích.
Bozho

7
Ngay cả khi bạn không thể sử dụng commons-lang, bạn có thể dễ dàng sao chép nguồn từ StringUtils để tạo chức năng của riêng bạn. Đó sẽ là một giải pháp chung tốt hơn nhiều so với câu trả lời được chọn. docjar.com/html/api/org/apache/commons/lang/ từ
kaliatech

3
Điều gì xảy ra nếu đó là phương pháp duy nhất mà thư viện được sử dụng? Có lẽ thư viện được thêm thậm chí còn lớn hơn nhiều lần so với ứng dụng được sử dụng. Tôi có thể tưởng tượng khá nhiều lý do để không thêm thư viện commons trong một ứng dụng. Đừng hiểu sai ý tôi: Tôi đồng ý, nó chứa những thứ rất hữu ích, nhưng tôi hiểu sự miễn cưỡng khi nhét một ứng dụng chứa đầy JAR bên ngoài nếu lợi ích không cần phải viết chỉ một (hoặc một vài) phương thức.
Bart Kiers

2
Để trả lời "Tại sao không sử dụng commons-lang? Nó có một loạt các tính năng bổ sung hữu ích." câu hỏi với một ví dụ cụ thể. Xiaomi cung cấp một phiên bản commons-lang lỗi thời trên các thiết bị Android của mình. Việc bao gồm một phiên bản mới hơn trong ứng dụng của bạn dẫn đến xung đột trình tải lớp, do đó, commons-lang không còn có thể được sử dụng trong bất kỳ dự án Android nào.
Nachi

1
@Nachi ngay cả khi StringUtils.leftPad đã lỗi thời
Lluis Martinez

29

Đây là những gì anh ấy thực sự yêu cầu tôi tin rằng:

String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple"); 

đầu ra:

000Apple

Không làm việc cho trường hợp chung; nếu bạn thay thế "Apple" bằng một chuỗi có độ dài 8 ký tự (có thể có trong trường hợp của OP) thì điều này sẽ ném một DuplicateFormatFlagsException(vì 00trong chuỗi định dạng). Nếu bạn thay thế một chuỗi dài hơn 8 ký tự, chuỗi này sẽ ném một IllegalFormatFlagsException(vì số âm).
Nbrooks

Bạn đã đúng, nhưng những gì về điều này sau đó : String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Bây giờ bạn sẽ không có ngoại lệ này.
Abhinav Puri

Chỉ muốn thêm String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);là SAI, nó nên được String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .

@ user4231709 Giải pháp tuyệt vời! +1
dùng1697575

25

Bạn có thể sử dụng phương thức String.format như được sử dụng trong câu trả lời khác để tạo chuỗi 0,

String.format("%0"+length+"d",0)

Điều này có thể được áp dụng cho vấn đề của bạn bằng cách điều chỉnh linh hoạt số lượng 0 đứng đầu trong một chuỗi định dạng:

public String leadingZeros(String s, int length) {
     if (s.length() >= length) return s;
     else return String.format("%0" + (length-s.length()) + "d%s", 0, s);
}

Đây vẫn là một giải pháp lộn xộn, nhưng có một ưu điểm là bạn có thể chỉ định tổng chiều dài của chuỗi kết quả bằng cách sử dụng một đối số nguyên.



15

Bạn có thể sử dụng điều này:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")

Cho đến nay câu trả lời tốt nhất. Apache commons StringUtils là một thư viện đơn giản nhưng cực kỳ hữu ích.
Zoidberg

Điều này tiết kiệm rất nhiều thời gian và nó cũng gọn gàng và sạch sẽ.
Abhishek

9

Tôi đã ở trong một tình huống tương tự và tôi đã sử dụng điều này; Nó khá ngắn gọn và bạn không phải đối phó với chiều dài hoặc thư viện khác.

String str = String.format("%8s","Apple");
str = str.replace(' ','0');

Đơn giản và gọn gàng. Định dạng chuỗi trả về " Apple"vì vậy sau khi thay thế không gian bằng số không, nó cho kết quả mong muốn.


Sau đó, bạn có thể muốn phân tách chuỗi trước, áp dụng thao tác trên cho giá trị phân tách đầu tiên, hơn là nối phần còn lại của các giá trị phân tách.
Erdi İzgi

6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

while (buf.length() < 8) {
  buf.insert(0, '0');
}

String output = buf.toString();


1
public class PaddingLeft {
    public static void main(String[] args) {
        String input = "Apple";
        String result = "00000000" + input;
        int length = result.length();
        result = result.substring(length - 8, length);
        System.out.println(result);
    }
}

1

Bạn có thể phải chăm sóc edgecase. Đây là một phương pháp chung.

public class Test {
    public static void main(String[] args){
        System.out.println(padCharacter("0",8,"hello"));
    }
    public static String padCharacter(String c, int num, String str){
        for(int i=0;i<=num-str.length()+1;i++){str = c+str;}
        return str;
    }
}

1
public static void main(String[] args)
{
    String stringForTest = "Apple";
    int requiredLengthAfterPadding = 8;
    int inputStringLengh = stringForTest.length();
    int diff = requiredLengthAfterPadding - inputStringLengh;
    if (inputStringLengh < requiredLengthAfterPadding)
    {
        stringForTest = new String(new char[diff]).replace("\0", "0")+ stringForTest;
    }
    System.out.println(stringForTest);
}

1
public static String lpad(String str, int requiredLength, char padChar) {
    if (str.length() > requiredLength) {
        return str;
    } else {
        return new String(new char[requiredLength - str.length()]).replace('\0', padChar) + str;
    }
}

Trong khi đoạn mã này được chào đón và có thể cung cấp một số trợ giúp, nó sẽ được cải thiện rất nhiều nếu nó bao gồm một lời giải thích về cách giải quyết câu hỏi. Không có điều đó, câu trả lời của bạn có giá trị giáo dục ít hơn nhiều - hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ! Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
Toby Speight

1

Trong Java:

String zeroes="00000000";
String apple="apple";

String result=zeroes.substring(apple.length(),zeroes.length())+apple;

Trong Scala:

"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}

Bạn cũng có thể khám phá một cách trong Java 8 để thực hiện bằng cách sử dụng các luồng và rút gọn (tương tự như cách tôi đã làm với Scala). Nó hơi khác với tất cả các giải pháp khác và tôi đặc biệt thích nó rất nhiều.


0

Điều này là nhanh chóng và làm việc cho bất cứ chiều dài.

public static String prefixZeros(String value, int len) {
    char[] t = new char[len];
    int l = value.length();
    int k = len-l;
    for(int i=0;i<k;i++) { t[i]='0'; }
    value.getChars(0, l, t, k);
    return new String(t);
}

0

Có thể nhanh hơn sau đó Chris Lercher trả lời khi hầu hết trong String có exacly 8 char

int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);

trong trường hợp của tôi trên máy của tôi nhanh hơn 1/8.


0

Đây là phiên bản "tập lệnh dễ đọc" đơn giản mà tôi sử dụng để đệm trước một chuỗi. (Đơn giản, dễ đọc và có thể điều chỉnh).

while(str.length() < desired_length)
  str = '0'+str;

0

Có ai đã thử giải pháp Java thuần túy này (không có SpringUtils):

//decimal to hex string 1=> 01, 10=>0A,..
String.format("%1$2s", Integer.toString(1,16) ).replace(" ","0");
//reply to original question, string with leading zeros. 
//first generates a 10 char long string with leading spaces, and then spaces are
//replaced by a zero string. 
String.format("%1$10s", "mystring" ).replace(" ","0");

Thật không may, giải pháp này chỉ hoạt động nếu bạn không có khoảng trắng trong chuỗi.


0

Nếu bạn muốn viết chương trình bằng Java thuần túy, bạn có thể làm theo phương pháp dưới đây hoặc có nhiều Chuỗi sử dụng để giúp bạn tốt hơn với các tính năng nâng cao hơn.

Sử dụng một phương pháp tĩnh đơn giản, bạn có thể đạt được điều này như dưới đây.

public static String addLeadingText(int length, String pad, String value) {
    String text = value;
    for (int x = 0; x < length - value.length(); x++) text = pad + text;
    return text;
}

Bạn có thể sử dụng phương pháp trên addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

Đầu ra sẽ là 000Apple


-3

Nó không đẹp, nhưng nó hoạt động. Nếu bạn có quyền truy cập apache commons tôi sẽ đề nghị sử dụng nó

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}

2
-1 có lẽ là do đây không phải là một ví dụ hay: bạn đang sử dụng "số ma thuật" và đang kết nối các Chuỗi, thứ gì đó nên được thay thế bằng cách sử dụng StringBuilder hoặc StringBuffer.
Bart Kiers
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.