2010-10-29 47 views

Trả lời

214

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

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

(Công trình, miễn là bạn Chuỗi không dài hơn 8 ký tự.)

+8

Đó là khá thông minh - nhưng nó đã cho tôi khoảng 30 giây để "làm cho nó". Tôi nghĩ rằng một giải pháp dễ đọc hơn sẽ tốt hơn. –

+2

Chủ nghĩa thực dụng là một chất lượng tuyệt vời! – Pascal

+2

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

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

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

+3

Nếu sử dụng thư viện java tiêu chuẩn, làm thế nào tôi có thể làm như vậy? Cảm ơn bạn. – Roy

+1

Tại sao không sử dụng commons-lang? Nó có rất nhiều tính năng bổ sung hữu ích. – Bozho

+4

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 để thực hiện 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. http://www.docjar.com/html/api/org/apache/commons/lang/StringUtils.java.html – kaliatech

241
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); 
    } 
} 
+28

Điều đó không hoạt động với các chuỗi (như OP được chỉ ra). –

+10

nhưng tôi muốn thêm hàng đầu bằng không trước một chuỗi thay vì một int. – Roy

+3

@ mR_fr0g không phải là lý do để bỏ phiếu! 6 người khác đã tìm thấy câu trả lời hữu ích. Bởi vì một cái gì đó không hoạt động trên hệ thống của bạn không có nghĩa là nó sai hoặc không hoạt động chút nào. Đó là phản ứng của quạt Apple điển hình! – infinity

-3

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

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

-1 có lẽ là vì đây là một ví dụ không tốt: bạn đang sử dụng "số ma thuật" và đang ghép chuỗi , cái gì đó nên được thay thế bằng cách sử dụng một StringBuilder hoặc StringBuffer. –

+2

-1 cho "val - 8" mặc dù đó là Chuỗi. –

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

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; 
    } 
} 
+0

Điều này là tốt, ngoại trừ bạn cần phải thay đổi các loại tham số trong chữ ký phương thức của 'padCharacter' để làm điều này thực sự hoạt động: http://ideone.com/hhccr. Thay đổi nó thành padCharacter (String, Integer, String) – Muhd

+0

@Muhd: Cảm ơn bạn đã phản hồi, cập nhật nó – bragboy

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

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

String output = buf.toString(); 
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); 
} 
19

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

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 tự động điều chỉnh số lượng 0 hà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); 
} 

Nó vẫn là một giải pháp lộn xộn, nhưng có lợi thế 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.

0

Đây là nhanh & hoạt động cho bất kỳ thời lượng nào.

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

Đây là những gì ông đã 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 
+0

cách tiếp cận "sledgehammer" rất sáng tạo – Johannes

+0

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

+0

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

0

Có thể nhanh hơn sau đó Chris Lercher answer khi hầu hết trong chuỗi 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 tính của tôi 1/8 nhanh hơn.

7

Bạn có thể sử dụng này:

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

Đế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

11

Sử dụng lớp Strings tiện ích ổi của:

Strings.padStart("Apple", 8, '0'); 
2

Tôi đã ở trong một tình huống tương tự và tôi đã sử dụng 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.

+1

Nếu chuỗi đã có dấu cách thì sao? –

0

Đây là phiên bản "không đọc được" phiên bản API đơ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
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; 
    } 
} 
+0

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] (// meta.stackexchange.com/q/114762) của * how * nó giải quyết các câu hỏi. Nếu 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ỉ là người hỏi bây giờ! Vui lòng [sửa] câu trả lời của bạn để thêm giải thích và đưa ra chỉ dẫn về những giới hạn và giả định được áp dụng. –

Các vấn đề liên quan