Відповіді:
Якщо вам доведеться це зробити без допомоги бібліотеки:
("00000000" + "Apple").substring("Apple".length())
(Працює до тих пір, поки ваша струна не буде більше 8 символів.)
("0000" + theString).substring(theString.length())
є більш реалістичним. Це колодки theString
з провідними нулями. Вибачте, не втримався додати цей коментар :)
StringBuilder
, і для його заповнення потрібен цикл. Якщо вимога справді полягає у врізанні лише 8-символьних рядків, це нормально, хоча це дуже вузький варіант використання, але це рішення ніколи не можна назвати швидким. Це просто коротко.
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
замість %07d
, ви отримаєте FormatFlagsConversionMismatchException
. ви можете спробувати.
StringUtils.leftPad(yourString, 8, '0');
Це з commons-lang . Дивіться javadoc
Це те, що він насправді просив, я вірю:
String.format("%0"+ (8 - "Apple".length() )+"d%s",0 ,"Apple");
вихід:
000Apple
DuplicateFormatFlagsException
(через 00
рядок формату). Якщо ви замінюєте рядок довжиною більше 8 символів, це кидає IllegalFormatFlagsException
(через від'ємне число).
String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);
. Тепер у вас немає цього винятку.
String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);
WRONG, так і має бути String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9);
.
Ви можете використовувати метод String.format, який використовується в іншій відповіді, щоб створити рядок 0,
String.format("%0"+length+"d",0)
Це можна застосувати до вашої проблеми, динамічно регулюючи кількість провідних 0 у рядку формату:
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);
}
Це все ще безладне рішення, але має таку перевагу, що ви можете вказати загальну довжину отриманого рядка, використовуючи цілий аргумент.
Використання Strings
класу корисності Guava :
Strings.padStart("Apple", 8, '0');
Я був у подібній ситуації, і я використав це; Це досить стисло, і вам не доведеться мати справу з довжиною чи іншою бібліотекою.
String str = String.format("%8s","Apple");
str = str.replace(' ','0');
Простий і акуратний. Формат рядків повертається, " Apple"
тому після заміни місця на нулі він дає бажаний результат.
String input = "Apple";
StringBuffer buf = new StringBuffer(input);
while (buf.length() < 8) {
buf.insert(0, '0');
}
String output = buf.toString();
Використовуйте Apache Commons StringUtils.leftPad (або подивіться на код, щоб зробити власну функцію).
Можливо, вам доведеться подбати про краєвиди. Це загальний метод.
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;
}
}
На Java:
String zeroes="00000000";
String apple="apple";
String result=zeroes.substring(apple.length(),zeroes.length())+apple;
У Scala:
"Apple".foldLeft("00000000"){(ac,e)=>ac.tail+e}
Ви також можете дослідити спосіб у Java 8 зробити це за допомогою потоків і зменшити (подібно до того, як я це робив зі Scala). Це трохи відрізняється від усіх інших рішень, і мені це особливо подобається.
Може бути швидшим, ніж відповідь Кріса Лерчера, коли більшість у Струні мають 8 знаків
int length = in.length();
return length == 8 ? in : ("00000000" + in).substring(length);
у моєму випадку на моїй машині на 1/8 швидше.
Хтось спробував це чисте рішення Java (без 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");
На жаль, це рішення працює лише в тому випадку, якщо у вас немає порожніх пробілів у рядку.
Якщо ви хочете написати програму на чистому Java, ви можете скористатися наведеним нижче способом або існує безліч String Utils, які допоможуть вам краще вдосконалитись з більш розширеними функціями.
Використовуючи простий статичний метод, ви можете досягти цього, як показано нижче.
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;
}
Можна скористатися вищевказаним методом addLeadingText(length, padding text, your text)
addLeadingText(8, "0", "Apple");
Вихід буде 000Apple
Це не дуже, але це працює. Якщо у вас є доступ до апаш-спільноти, я б запропонував це використовувати
if (val.length() < 8) {
for (int i = 0; i < val - 8; i++) {
val = "0" + val;
}
}