¿Cómo formatear una cadena Java con cero a la izquierda?

192

Aquí está la cadena, por ejemplo:

"Apple"

y me gustaría agregar cero para completar 8 caracteres:

"000Apple"

¿Como lo puedo hacer?

Roy
fuente

Respuestas:

287

En caso de que tenga que hacerlo sin la ayuda de una biblioteca:

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

(Funciona, siempre que su Cadena no sea más larga que 8 caracteres).

Chris Lercher
fuente
21
Eso es bastante inteligente, pero me llevó unos 30 segundos "entenderlo". Creo que una solución más legible sería mejor.
Amy B
2
Esta es una solución excelente cuando está integrando software en algo sin mucho espacio y las bibliotecas adicionales simplemente no son una opción. ¡¡Gracias!!
Casey Murray
¡Esta versión es una locura rápida! Me encanta.
Dakkaron
2
@Mathu honestamente eso no es difícil de entender. Se concatenan dos cadenas (se unen) y se extraen los primeros 5 caracteres. Sin magia No es muy sensato en este caso (para Apple de cadena fija) pero fácil de entender. ("0000" + theString).substring(theString.length())Es más realista. Esto rellena theStringcon ceros a la izquierda. Lo siento, no pude resistir agregar este comentario :)
HankCa
1
Esta solución tiene una sintaxis corta pero no es "locamente rápida". Si tiene suerte, el compilador lo optimizará, pero esencialmente la forma "rápida" real de hacerlo es usar un StringBuilder, y se necesita un ciclo para completarlo. Si el requisito es realmente solo truncar cadenas de 8 caracteres, está bien, aunque es un caso de uso muy limitado, pero esta solución nunca se puede llamar rápido. Es solo corto.
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);
    }
}
Alex Rashkov
fuente
14
pero me gustaría agregar cero a la izquierda antes de una cadena en lugar de un int.
Roy
1
Puede usar StringUtils o DecimalFormat para Java 1.4 y versiones posteriores. Marque aquí javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev
3
@Variag use en %07s lugar de %07d, obtendrá un FormatFlagsConversionMismatchException. puedes probarlo.
Z fp
127
 StringUtils.leftPad(yourString, 8, '0');

Esto es de commons-lang . Ver javadoc

Bozho
fuente
3
¿Por qué no usar commons-lang? Tiene un montón de extras útiles.
Bozho
77
Incluso si no puede usar commons-lang, puede copiar fácilmente la fuente de StringUtils para hacer su propia función. Esa sería una solución general mucho mejor que la respuesta seleccionada. docjar.com/html/api/org/apache/commons/lang/…
kaliatech
3
¿Qué pasaría si ese fuera el único método para el que se usa la biblioteca? Quizás la biblioteca agregada sea incluso muchas veces más grande que la aplicación en la que se usa. Me puedo imaginar algunas razones para no agregar una biblioteca común en una aplicación. No me malinterpreten: estoy de acuerdo, contiene cosas muy útiles, pero entiendo la renuencia a rellenar una aplicación llena de JAR externos si el beneficio no es tener que escribir solo uno (o un par) de métodos.
Bart Kiers
2
Para responder a "¿Por qué no usar commons-lang? Tiene una gran cantidad de extras útiles". pregunta con un ejemplo concreto. Xiaomi envía una versión desactualizada de commons-lang en sus dispositivos Android. La inclusión de una versión más nueva en su aplicación genera conflictos con el cargador de clases, por lo que commons-lang ya no se puede usar en ningún proyecto de Android.
Nachi
1
@Nachi, incluso si StringUtils.leftPad fuera obsoleto
Lluis Martinez
29

Esto es lo que realmente estaba pidiendo, creo:

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

salida:

000Apple

fuente
No funciona para el caso general; si sustituye "Apple" con una cadena de 8 caracteres de longitud (que es posible en el caso de OP), esto arroja un DuplicateFormatFlagsException(debido 00a la cadena en el formato). Si sustituye una cadena de más de 8 caracteres, esto arroja un IllegalFormatFlagsException(debido al número negativo).
nbrooks
Tiene usted razón, pero ¿qué pasa esto, entonces: String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Ahora no tendrás esta excepción.
Abhinav Puri
Solo quiero agregar String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);que ES INCORRECTO, debería ser String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .
@ user4231709 ¡Gran solución! +1
usuario1697575
25

Puede usar el método String.format como se usa en otra respuesta para generar una cadena de 0,

String.format("%0"+length+"d",0)

Esto se puede aplicar a su problema ajustando dinámicamente el número de ceros a la izquierda en una cadena de formato:

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

Sigue siendo una solución desordenada, pero tiene la ventaja de que puede especificar la longitud total de la cadena resultante utilizando un argumento entero.

ChadyWady
fuente
17

Usando la Stringsclase de utilidad de Guava :

Strings.padStart("Apple", 8, '0');
Olivier Grégoire
fuente
15

Puedes usar esto:

org.apache.commons.lang.StringUtils.leftPad("Apple", 8, "0")
Bency Baby
fuente
Con mucho, la mejor respuesta. Apache commons StringUtils es una biblioteca simple pero extremadamente útil.
Zoidberg
Esto ahorró mucho tiempo y también está limpio y ordenado.
Abhishek el
9

He estado en una situación similar y usé esto; Es bastante conciso y no tiene que lidiar con la longitud u otra biblioteca.

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

Simple y ordenado. El formato de cadena vuelve " Apple"así que después de reemplazar el espacio con ceros, da el resultado deseado.

Erdi İzgi
fuente
Entonces es posible que desee dividir la cadena primero, aplicar la operación anterior al primer valor dividido y luego concatenar el resto de los valores divididos.
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
fuente
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);
    }
}
Arne Deutsch
fuente
1

Puede que tenga que cuidar edgecase. Este es un método genérico.

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;
    }
}
fanfarrón
fuente
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);
}
Fathah Rehman P
fuente
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
fuente
Si bien este fragmento de código es bienvenido y puede proporcionar algo de ayuda, sería mucho mejor si incluyera una explicación de cómo aborda la pregunta. Sin eso, su respuesta tiene mucho menos valor educativo: recuerde que está respondiendo la pregunta para los lectores en el futuro, ¡no solo la persona que pregunta ahora! Por favor, editar su respuesta para agregar explicación y dar una indicación de lo que se aplican limitaciones y supuestos.
Toby Speight
1

En Java:

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

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

En Scala:

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

También puede explorar una forma en Java 8 para hacerlo usando secuencias y reducir (similar a como lo hice con Scala). Es un poco diferente a todas las otras soluciones y particularmente me gusta mucho.

Carlos
fuente
0

Esto es rápido y funciona para cualquier longitud.

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);
}
Deian
fuente
0

Puede ser más rápido que la respuesta de Chris Lercher cuando la mayor parte de String tiene exactamente 8 caracteres

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

en mi caso en mi máquina 1/8 más rápido.

Kuguar6
fuente
0

Aquí está la versión simple de "script legible" sin API que uso para rellenar previamente una cadena. (Simple, legible y ajustable).

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

¿Alguien intentó esta solución pura de Java (sin 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");

Desafortunadamente, esta solución solo funciona si no tiene espacios en blanco en una cadena.

Gico
fuente
0

Si desea escribir el programa en Java puro, puede seguir el siguiente método o hay muchas Utilidades de cadena para ayudarlo mejor con características más avanzadas.

Usando un método estático simple, puede lograr esto de la siguiente manera.

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

Puedes usar el método anterior addLeadingText(length, padding text, your text)

addLeadingText(8, "0", "Apple");

La salida sería 000Apple

Googliano
fuente
-3

No es bonito, pero funciona. Si tiene acceso a apache commons, le sugiero que use ese

if (val.length() < 8) {
  for (int i = 0; i < val - 8; i++) {
    val = "0" + val;
  }
}
mR_fr0g
fuente
2
El -1 probablemente se deba a que este no es un buen ejemplo: está usando "números mágicos" y está concatenando cadenas, algo que debería reemplazarse usando un StringBuilder o StringBuffer.
Bart Kiers