Заполнение строки нулями слева

Я видел похожие вопросы здесь и здесь.

Но я не понимаю, как оставить строку с помощью нуля.

ввод: «129018» вывод: «0000129018»

Общая длина вывода должна быть TEN.


person jai    schedule 17.12.2010    source источник


Ответы (20)


Если ваша строка содержит только числа, вы можете сделать ее целым числом, а затем выполнить заполнение:

String.format("%010d", Integer.parseInt(mystring));

Если не , я хотел бы знать, как это можно сделать.

person khachik    schedule 17.12.2010
comment
Выдергивал свои волосы, потому что не видел, что мне нужно выполнить Integer.parseInt (). - person JRSofty; 15.06.2012
comment
Кроме того, для тех, кто хочет дополнить свои числа / строки чем-то еще, кроме 0, измените %0 на %yourchoice. - person micnguyen; 24.05.2013
comment
Небольшое предупреждение: это решение не удалось для больших значений Integer (например, 9999999999); поэтому я пошел с решением Оливера Михелса, используя Apache Commons. - person oneworld; 31.05.2014
comment
В случае больших целочисленных значений, таких как 9999999999, String.format() поддерживает BigInteger, например: String.format("%010d", new BigInteger("9999999999")) - person real_paul; 23.12.2015
comment
@micnguyen Ты уверен? 0 после% - это флаг. Возможные флаги очень ограничены. - person Gustavo; 28.07.2017

String paddedString = org.apache.commons.lang.StringUtils.leftPad("129018", 10, "0")

второй параметр - желаемая длина вывода

"0" - это символ заполнения

person Oliver Michels    schedule 17.12.2010
comment
Напоминаем, что String неизменяемо (см. Строка неизменяема. Что именно означает? < / i>), поэтому StringUtils.leftPad(variable, 10, "0"); не изменит значение variable. Вам нужно будет присвоить ему результат, например: variable = StringUtils.leftPad(variable, 10, "0");. - person falsarella; 19.05.2015
comment
Было бы неплохо увидеть вывод предложенной команды без необходимости ее запускать. Где-то слышал, что хороший - это ленивый :) Так или иначе, вот он: StringUtils.leftPad (1, 3, '0') - ›001. - person AlikElzin-kilaka; 28.10.2020

Это будет дополнять оставленную строку до общей ширины 10, не беспокоясь об ошибках синтаксического анализа:

String unpadded = "12345"; 
String padded = "##########".substring(unpadded.length()) + unpadded;

//unpadded is "12345"
//padded   is "#####12345"

Если вы хотите заполнить вправо:

String unpadded = "12345"; 
String padded = unpadded + "##########".substring(unpadded.length());

//unpadded is "12345"
//padded   is "12345#####"  

Вы можете заменить символы «#» любым символом, которым вы хотите заполнить, повторяя количество раз, которое вы хотите, чтобы общая ширина строки была. Например. если вы хотите добавить нули слева, чтобы вся строка состояла из 15 символов:

String unpadded = "12345"; 
String padded = "000000000000000".substring(unpadded.length()) + unpadded;

//unpadded is "12345"
//padded   is "000000000012345"  

Преимущество этого ответа по сравнению с ответом хачика заключается в том, что он не использует Integer.parseInt, который может генерировать исключение (например, если число, которое вы хотите дополнить, слишком велико, например 12147483647). Недостатком является то, что если то, что вы заполняете, уже является int, вам придется преобразовать его в String и обратно, что нежелательно.

Итак, если вы точно знаете, что это int, ответ хачика отлично работает. Если нет, то это возможная стратегия.

person Rick Hanlon II    schedule 27.02.2013
comment
Может потребоваться соблюдать осторожность с длиной дополняемой строки - вызов substring () может вызвать исключение IndexOutOfBoundsException. - person Hitman; 03.11.2014
comment
плюс производительность? Я думаю, что это создает 3 разных строки, если я не ошибаюсь. - person Aditya Peshave; 22.03.2016
comment
Почему за это проголосовали? Это связано с JavaScript, а не с Java? - person mhvelplund; 18.03.2018
comment
@mhvelplund Его отредактировал 2 марта Рик, я думаю, он просто ошибся, я отменил изменение. - person Magnus; 29.03.2018
comment
Спасибо @Magnus, это определенно была ошибка - person Rick Hanlon II; 29.03.2018
comment
ОТЛИЧНЫЙ! это помогло мне - person RXSD; 29.09.2020

Вы можете использовать apache commons StringUtils

StringUtils.leftPad("129018", 10, "0");

https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#leftPad(java.lang.String,%20int,%20char)

person thk    schedule 17.12.2010
comment
К вашему сведению, ссылка мертва. - person stkent; 25.06.2017

Для форматирования строки используйте

import org.apache.commons.lang.StringUtils;

public class test {

    public static void main(String[] args) {

        String result = StringUtils.leftPad("wrwer", 10, "0");
        System.out.println("The String : " + result);

    }
}

Выход: Строка: 00000wrwer

Где первый аргумент - это форматируемая строка, второй аргумент - это длина желаемой выходной длины, а третий аргумент - это символ, которым строка должна быть дополнена.

Воспользуйтесь ссылкой, чтобы скачать банку http://commons.apache.org/proper/commons-lang/download_lang.cgi

person Nagarajan S R    schedule 07.01.2014

Если вам нужна производительность и вы знаете максимальный размер строки, используйте это:

String zeroPad = "0000000000000000";
String str0 = zeroPad.substring(str.length()) + str;

Помните о максимальном размере строки. Если он больше размера StringBuffer, вы получите java.lang.StringIndexOutOfBoundsException.

person Haroldo Macedo    schedule 29.07.2015
comment
Это прекрасно работает. К счастью, я имел дело с двоичными числами, поэтому я знал, что максимальное значение будет 8. Спасибо. - person frostymarvelous; 29.09.2015
comment
Это совсем не элегантно. Каждый раз, когда вы хотите заполнить, вам нужно создать переменную. - person luizfzs; 04.07.2017

Старый вопрос, но у меня тоже есть два метода.


Для фиксированной (предопределенной) длины:

    public static String fill(String text) {
        if (text.length() >= 10)
            return text;
        else
            return "0000000000".substring(text.length()) + text;
    }

Для переменной длины:

    public static String fill(String text, int size) {
        StringBuilder builder = new StringBuilder(text);
        while (builder.length() < size) {
            builder.append('0');
        }
        return builder.toString();
    }
person user85421    schedule 25.05.2011

Используйте Google Guava:

Maven:

<dependency>
     <artifactId>guava</artifactId>
     <groupId>com.google.guava</groupId>
     <version>14.0.1</version>
</dependency>

Пример кода:

Strings.padStart("129018", 10, '0') returns "0000129018"  
person Tho    schedule 03.05.2015

Я предпочитаю этот код:

public final class StrMgr {

    public static String rightPad(String input, int length, String fill){                   
        String pad = input.trim() + String.format("%"+length+"s", "").replace(" ", fill);
        return pad.substring(0, length);              
    }       

    public static String leftPad(String input, int length, String fill){            
        String pad = String.format("%"+length+"s", "").replace(" ", fill) + input.trim();
        return pad.substring(pad.length() - length, pad.length());
    }
}

а потом:

System.out.println(StrMgr.leftPad("hello", 20, "x")); 
System.out.println(StrMgr.rightPad("hello", 20, "x"));
person strobering    schedule 16.09.2016
comment
Я думаю, вы перепутали левую и правую. StrMgr.leftPad добавляет отступ к строке, а StrMgr.rightPad добавляется. Для меня (по крайней мере) я ожидал, что левая панель добавит отступ к передней части строки. - person PassKit; 16.01.2017
comment
Да ты прав! Исправлено сейчас! Спасибо @Passkit - person strobering; 15.02.2017

Основываясь на ответе @Haroldo Macêdo, я создал метод в своем пользовательском классе Utils, например

/**
 * Left padding a string with the given character
 *
 * @param str     The string to be padded
 * @param length  The total fix length of the string
 * @param padChar The pad character
 * @return The padded string
 */
public static String padLeft(String str, int length, String padChar) {
    String pad = "";
    for (int i = 0; i < length; i++) {
        pad += padChar;
    }
    return pad.substring(str.length()) + str;
}

Затем позвоните Utils.padLeft(str, 10, "0");

person Sithu    schedule 08.05.2016
comment
Я предпочитаю такие простые логические подходы, как этот, по сравнению с другими «умными» ответами, но я бы предложил использовать StringBuffer или StringBuilder. - person Henry; 11.08.2018

Вот еще один подход:

int pad = 4;
char[] temp = (new String(new char[pad]) + "129018").toCharArray()
Arrays.fill(temp, 0, pad, '0');
System.out.println(temp)
person nullpotent    schedule 19.08.2013

Вот мое решение:

String s = Integer.toBinaryString(5); //Convert decimal to binary
int p = 8; //preferred length
for(int g=0,j=s.length();g<p-j;g++, s= "0" + s);
System.out.println(s);

Вывод: 00000101

person sh3r1    schedule 24.08.2016

Правое заполнение с фиксированной длиной-10: String.format ("% 1 $ -10s", "abc") Левое заполнение с фиксированной длиной-10: String.format ("% 1 $ 10s", "abc")

person Arun    schedule 20.11.2014
comment
знак доллара для тех, кто не знает, что это: stackoverflow.com/a/33458861/1422630 - person Aquarius Power; 30.05.2016
comment
это все равно потребует замены пробелов на нули - person Aquarius Power; 30.05.2016

Вот решение на основе String.format, которое будет работать для строк и подходит для переменной длины.

public static String PadLeft(String stringToPad, int padToLength){
    String retValue = null;
    if(stringToPad.length() < padToLength) {
        retValue = String.format("%0" + String.valueOf(padToLength - stringToPad.length()) + "d%s",0,stringToPad);
    }
    else{
        retValue = stringToPad;
    }
    return retValue;
}

public static void main(String[] args) {
    System.out.println("'" + PadLeft("test", 10) + "'");
    System.out.println("'" + PadLeft("test", 3) + "'");
    System.out.println("'" + PadLeft("test", 4) + "'");
    System.out.println("'" + PadLeft("test", 5) + "'");
}

Вывод: '000000test' 'test' 'test' 0test '

person P.V.M. Kessels    schedule 29.07.2015

Решение Satish очень хорошее среди ожидаемых ответов. Я хотел сделать его более общим, добавив в строку формата переменную n вместо 10 символов.

int maxDigits = 10;
String str = "129018";
String formatString = "%"+n+"s";
String str2 = String.format(formatString, str).replace(' ', '0');
System.out.println(str2);

Это сработает в большинстве ситуаций

person Prabhu    schedule 02.03.2016

    int number = -1;
    int holdingDigits = 7;
    System.out.println(String.format("%0"+ holdingDigits +"d", number));

Только что спросил об этом в интервью ........

Мой ответ ниже, но это (упомянутое выше) намного лучше->

String.format("%05d", num);

Мой ответ:

static String leadingZeros(int num, int digitSize) {
    //test for capacity being too small.

    if (digitSize < String.valueOf(num).length()) {
        return "Error : you number  " + num + " is higher than the decimal system specified capacity of " + digitSize + " zeros.";

        //test for capacity will exactly hold the number.
    } else if (digitSize == String.valueOf(num).length()) {
        return String.valueOf(num);

        //else do something here to calculate if the digitSize will over flow the StringBuilder buffer java.lang.OutOfMemoryError 

        //else calculate and return string
    } else {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < digitSize; i++) {
            sb.append("0");
        }
        sb.append(String.valueOf(num));
        return sb.substring(sb.length() - digitSize, sb.length());
    }
}
person bockymurphy    schedule 26.04.2013
comment
Почему вы возвращаете ошибку в первом случае, а не исключение (если это ваше требование), вы нарушаете шаблон возврата функции. почему бы вам просто не вернуть строковое значение числа, как во втором случае (поскольку это также допустимый ввод для универсального метода) - person A myth; 10.04.2014

Проверьте мой код, который будет работать для целых чисел и строк.

Предположим, что наше первое число - 129018. И мы хотим добавить к нему нули, чтобы длина последней строки была 10. Для этого вы можете использовать следующий код.

    int number=129018;
    int requiredLengthAfterPadding=10;
    String resultString=Integer.toString(number);
    int inputStringLengh=resultString.length();
    int diff=requiredLengthAfterPadding-inputStringLengh;
    if(inputStringLengh<requiredLengthAfterPadding)
    {
        resultString=new String(new char[diff]).replace("\0", "0")+number;
    }        
    System.out.println(resultString);
person Fathah Rehman P    schedule 24.07.2014

Я использовал это:

DecimalFormat numFormat = new DecimalFormat("00000");
System.out.println("Code format: "+numFormat.format(123));

Результат: 00123

Надеюсь, вы сочтете это полезным!

person Carlos Muñoz    schedule 27.06.2016

person    schedule
comment
это более обходной подход, чем принятый ответ. - person Paul W; 26.05.2011
comment
@PaulW: но он работает для строк - person Janus Troelsen; 17.05.2012
comment
Это не сработало бы, если бы в строке были пробелы ... - person JKillian; 01.06.2014

person    schedule
comment
+1 за то, что это единственный правильный ответ, который не использует внешнюю библиотеку - person Joeri Hendrickx; 17.12.2010
comment
Просто обратите внимание на размер буфера StringBuilder, его значение по умолчанию - 16, и для больших форматированных размеров правильно установите размер буфера, например: StringBuilder sb = new StringBuilder(); - person Welington Veiga; 19.06.2012