Как отформатировать строку 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-символьные строки, это нормально, хотя это очень узкий вариант использования, но это решение никогда нельзя назвать быстрым. Это просто коротко.
Дичи
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');

Это из общего достояния . См Javadoc

Bozho
источник
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
@Начи, даже если должен существовать устаревший StringUtils.leftPad
Луис Мартинес
29

Это то, что он действительно просил, я верю:

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

вывод:

000Apple

источник
Не работает для общего случая; если вы замените «Apple» строкой длиной 8 символов (что возможно в случае с OP), это выдаст 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);это НЕПРАВИЛЬНО, так и должно быть String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .
@ user4231709 Отличное решение! +1
user1697575
25

Вы можете использовать метод String.format, как в другом ответе, чтобы сгенерировать строку из 0,

String.format("%0"+length+"d",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);
}

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

ChadyWady
источник
17

Используя Stringsслужебный класс Guava :

Strings.padStart("Apple", 8, '0');
Оливье Грегуар
источник
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"поэтому после замены пробела нулями он дает желаемый результат.

Эрди Изги
источник
Затем вы можете сначала разделить строку, применить вышеописанную операцию к первому значению разделения, а затем объединить остальные значения разделения.
Erdi İzgi
6
String input = "Apple";
StringBuffer buf = new StringBuffer(input);

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

String output = buf.toString();
robert_x44
источник
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

Возможно, вам придется позаботиться о edgecase. Это общий метод.

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;
    }
}
bragboy
источник
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;
    }
}
Nabil_H
источник
Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, он будет значительно улучшен, если в него будет включено объяснение того, как он решает этот вопрос. Без этого ваш ответ имеет гораздо меньшую образовательную ценность - помните, что в будущем вы отвечаете на вопрос читателей, а не просто того, кто спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются.
Тоби
1

В Java:

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

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

В Скала:

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

В Java 8 вы также можете найти способ сделать это с помощью потоков и сокращения (аналогично тому, как я это делал в Scala). Это немного отличается от всех других решений, и мне это особенно нравится.

Carlos
источник
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

Может быть быстрее, чем Крис Лерчер отвечает, когда большинство в String имеют точно 8 символов

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

в моем случае на моей машине 1/8 быстрее.

Kuguar6
источник
0

Вот простая версия «читаемого сценария» без API, которую я использую для предварительного заполнения строки. (Простой, читаемый и регулируемый).

while(str.length() < desired_length)
  str = '0'+str;
Tezra
источник
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");

К сожалению, это решение работает, только если в строке нет пробелов.

Gico
источник
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

Googlian
источник
-3

Это не красиво, но это работает. Если у вас есть доступ к Apache Commons, я бы предложил использовать это

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}
mR_fr0g
источник
2
-1, вероятно, потому, что это не очень хороший пример: вы используете «магические числа» и объединяете строки, то есть то, что следует заменить с помощью StringBuilder или StringBuffer.
Барт Киерс