Câu trả lời:
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ự.)
("0000" + theString).substring(theString.length())
là thực tế hơn. Miếng đệm này theString
vớ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 :)
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.
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);
}
}
%07s
thay vì %07d
, bạn sẽ nhận được a FormatFlagsConversionMismatchException
. bạn có thể thử nó
StringUtils.leftPad(yourString, 8, '0');
Đây là từ commons-lang . Xem javadoc
Đâ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
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ự, chuỗi này sẽ ném một IllegalFormatFlagsException
(vì số âm).
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.
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);
.
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.
Sử dụng Strings
lớp tiện ích của Guava :
Strings.padStart("Apple", 8, '0');
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.
String input = "Apple";
StringBuffer buf = new StringBuffer(input);
while (buf.length() < 8) {
buf.insert(0, '0');
}
String output = buf.toString();
Sử dụng Apache Commons StringUtils.leftPad (hoặc xem mã để tạo chức năng của riêng bạn).
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;
}
}
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);
}
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 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.
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.
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.
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
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;
}
}