Як відформатувати рядок Java з початковим нулем?


192

Ось рядок, наприклад:

"Apple"

і я хотів би додати нуль, щоб заповнити 8 символів:

"000Apple"

Як я можу це зробити?

Відповіді:


287

Якщо вам доведеться це зробити без допомоги бібліотеки:

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

(Працює до тих пір, поки ваша струна не буде більше 8 символів.)


21
Це досить розумно - але мені знадобилося близько 30 секунд, щоб "дістати". Я думаю, що краще читати рішення буде краще.
Емі Б

2
Це видатне рішення, коли ви вставляєте програмне забезпечення на щось без особливого місця, а додаткові бібліотеки просто не є варіантом. Дякую!!
Кейсі Мюррей

Ця версія з розуму швидко! Я це люблю.
Даккарон

2
@Mathu чесно, що це не важко зрозуміти. Два рядки об'єднані (з'єднані разом) і перші 5 символів витягнуті з нього. Ніякої магії. У цьому випадку не дуже розумно (для фіксованого рядка Apple), але легко зрозуміти. ("0000" + theString).substring(theString.length())є більш реалістичним. Це колодки theStringз провідними нулями. Вибачте, не втримався додати цей коментар :)
HankCa

1
Це рішення має короткий синтаксис, але воно не є "божевільним швидким". Якщо вам пощастить, компілятор оптимізує це, але, по суті, справжній "швидкий" спосіб зробити це за допомогою a StringBuilder, і для його заповнення потрібен цикл. Якщо вимога справді полягає у врізанні лише 8-символьних рядків, це нормально, хоча це дуже вузький варіант використання, але це рішення ніколи не можна назвати швидким. Це просто коротко.
Dici

321
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
але я хотів би додати початковий нуль перед рядком замість int.
Рой

1
Ви можете використовувати StringUtils або DecimalFormat для Java 1.4 і нижче. Перевірте тут javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
@Variag %07s замість %07d, ви отримаєте FormatFlagsConversionMismatchException. ви можете спробувати.
Z fp

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

Це з commons-lang . Дивіться javadoc


3
Чому б не використовувати commons-lang? У ньому є багатство корисних додатків.
Божо

7
Навіть якщо ви не можете використовувати commons-lang, ви можете легко скопіювати джерело з StringUtils, щоб зробити власну функцію. Це було б набагато краще загальне рішення, ніж обрана відповідь. docjar.com/html/api/org/apache/commons/lang/…
kaliatech

3
що робити, якщо це буде єдиний метод, для якого використовується бібліотека? Можливо, додана бібліотека навіть у багато разів більша за додаток, в якому вона використовується. Я можу уявити собі цілком певні причини, щоб не додавати бібліотеку спільнот у додаток. Не зрозумійте мене неправильно: я згоден, він містить дуже корисні речі, але я розумію небажання заповнювати додаток, повний зовнішніх JAR, якщо користь не потребує написання лише одного (або пари) методів.
Барт Кіерс

2
Щоб відповісти на запитання "Чому б не використовувати commons-lang? У ньому є певна кількість корисних додатків". питання з конкретним прикладом. Xiaomi постачає застарілу версію commons-lang на своїх пристроях Android. Включення нової версії у ваш додаток призводить до конфліктів між завантажувачами, тому commons-lang більше не можна використовувати в жодному Android-проекті.
Начі

1
@Nachi, навіть якщо застарілий StringUtils.leftPad повинен існувати
Lluis Martinez

29

Це те, що він насправді просив, я вірю:

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

вихід:

000Apple

Не працює для загальної справи; якщо ви заміните "Apple" рядком довжиною 8 символів (що можливо у випадку з ОП), це кине a DuplicateFormatFlagsException(через 00рядок формату). Якщо ви замінюєте рядок довжиною більше 8 символів, це кидає IllegalFormatFlagsException(через від'ємне число).
nbrooks

Ви маєте рацію, але що про це тоді: 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); .

@ user4231709 Чудове рішення! +1
користувач1697575

25

Ви можете використовувати метод 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);
}

Це все ще безладне рішення, але має таку перевагу, що ви можете вказати загальну довжину отриманого рядка, використовуючи цілий аргумент.



15

Ви можете скористатися цим:

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

На сьогодні найкраща відповідь. Apache commons StringUtils - це проста, але надзвичайно корисна бібліотека.
Зойдберг

Це економило багато часу, а також акуратно та чисто.
Абхішек

9

Я був у подібній ситуації, і я використав це; Це досить стисло, і вам не доведеться мати справу з довжиною чи іншою бібліотекою.

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

Простий і акуратний. Формат рядків повертається, " Apple"тому після заміни місця на нулі він дає бажаний результат.


Тоді ви можете спершу розділити рядок, застосувати вище операцію до першого значення розділення, ніж об'єднати решта значень розділення.
Ерді Ізгі

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

Можливо, вам доведеться подбати про краєвиди. Це загальний метод.

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

Хоча цей фрагмент коду вітається і може надати деяку допомогу, він би значно покращився, якби він включив пояснення того, як він вирішує питання. Без цього ваша відповідь має набагато меншу освітянську цінність - пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз запитує! Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Toby Speight

1

На 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). Це трохи відрізняється від усіх інших рішень, і мені це особливо подобається.


0

Це швидко і працює будь-якої довжини.

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

Може бути швидшим, ніж відповідь Кріса Лерчера, коли більшість у Струні мають 8 знаків

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

у моєму випадку на моїй машині на 1/8 швидше.


0

Ось найпростіша версія для читання сценарію, що не потребує API, яку я використовую для попереднього накладення рядка. (Простий, читабельний та регульований).

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

0

Хтось спробував це чисте рішення 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");

На жаль, це рішення працює лише в тому випадку, якщо у вас немає порожніх пробілів у рядку.


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


-3

Це не дуже, але це працює. Якщо у вас є доступ до апаш-спільноти, я б запропонував це використовувати

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

2
-1, мабуть, тому, що це не настільки хороший приклад: ви використовуєте "магічні числа" і об'єднуєте рядки, що слід замінити використанням StringBuilder або StringBuffer.
Барт Кіерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.