Comment formater une chaîne Java avec un zéro non significatif?


192

Voici la chaîne, par exemple:

"Apple"

et je voudrais ajouter zéro pour remplir 8 caractères:

"000Apple"

Comment puis-je le faire?

Réponses:


287

Au cas où vous deviez le faire sans l'aide d'une bibliothèque:

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

(Fonctionne, tant que votre chaîne ne dépasse pas 8 caractères.)


21
C'est assez intelligent - mais il m'a fallu environ 30 secondes pour «comprendre». Je pense qu'une solution plus lisible serait meilleure.
Amy B

2
C'est une excellente solution lorsque vous intégrez un logiciel sur quelque chose sans beaucoup d'espace et que les bibliothèques supplémentaires ne sont tout simplement pas une option. Merci!!
Casey Murray

Cette version est très rapide! J'aime cela.
Dakkaron

2
@Mathu honnêtement, ce n'est pas difficile à comprendre. Deux chaînes sont concaténées (jointes ensemble) et les 5 premiers caractères en sont extraits. Pas de magie. Pas très sensible dans ce cas (pour la chaîne fixe Apple) mais facile à comprendre. ("0000" + theString).substring(theString.length())est plus réaliste. Cette garniture theStringavec des zéros non significatifs. Désolé n'a pas pu résister à l'ajout de ce commentaire :)
HankCa

1
Cette solution a une syntaxe courte mais ce n'est pas "très rapide". Si vous avez de la chance, le compilateur l'optimisera, mais essentiellement la vraie façon "rapide" de le faire est d'utiliser a StringBuilder, et il faut une boucle pour le remplir. Si l'exigence est vraiment de ne tronquer que les chaînes de 8 caractères, c'est bien, bien que ce soit un cas d'utilisation très restreint, mais cette solution ne peut jamais être appelée rapidement. C'est juste court.
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
mais je voudrais ajouter un zéro avant une chaîne au lieu d'un int.
Roy

1
Vous pouvez utiliser StringUtils ou DecimalFormat pour Java 1.4 et versions antérieures. Vérifiez ici javadevnotes.com/java-integer-to-string-with-leading-zeros
JavaDev

3
@Variag utilise %07s au lieu de %07d, vous obtiendrez un fichier FormatFlagsConversionMismatchException. Tu peux l'essayer.
Z fp

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

Cela vient de commons-lang . Voir javadoc


3
Pourquoi ne pas utiliser commons-lang? Il a un butin d'extras utiles.
Bozho

7
Même si vous ne pouvez pas utiliser commons-lang, vous pouvez facilement copier la source depuis StringUtils pour créer votre propre fonction. Ce serait une bien meilleure solution générale que la réponse choisie. docjar.com/html/api/org/apache/commons/lang/…
kaliatech

3
et si ce serait la seule méthode pour laquelle la bibliothèque est utilisée? Peut-être que la bibliothèque ajoutée est même plusieurs fois plus grande que l'application dans laquelle elle est utilisée. Je peux imaginer de nombreuses raisons de ne pas ajouter une bibliothèque commune dans une application. Ne vous méprenez pas: je suis d'accord, il contient des éléments très utiles, mais je comprends la réticence à remplir une application de fichiers JAR externes si l'avantage n'est pas d'écrire une seule (ou deux) méthodes.
Bart Kiers

2
Pour répondre à la question "Pourquoi ne pas utiliser commons-lang? Il a un butin d'extras utiles." question avec un exemple concret. Xiaomi propose une version obsolète de commons-lang sur ses appareils Android. L'inclusion d'une version plus récente dans votre application entraîne des conflits de chargeur de classe, de sorte que commons-lang ne peut plus être utilisé dans aucun projet Android.
Nachi

1
@Nachi même si StringUtils.leftPad obsolète devrait exister
Lluis Martinez

29

C'est ce qu'il demandait vraiment je crois:

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

production:

000Apple

Ne fonctionne pas pour le cas général; si vous remplacez "Apple" par une chaîne de 8 caractères de longueur (ce qui est possible dans le cas d'OP), cela lance un DuplicateFormatFlagsException(à cause de la 00chaîne de formatage). Si vous remplacez une chaîne de plus de 8 caractères, cela lève un IllegalFormatFlagsException(à cause du nombre négatif).
nbrooks

Vous avez raison, mais qu'en est- ce alors: String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8); . Maintenant, vous n'aurez plus cette exception.
Abhinav Puri

Je veux juste ajouter String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(0,8);c'est FAUX, ça devrait l'être String.format("%0"+ (9 - "Apple".length() )+"d%s",0 ,"Apple").substring(1,9); .

@ user4231709 Excellente solution! +1
user1697575

25

Vous pouvez utiliser la méthode String.format telle qu'utilisée dans une autre réponse pour générer une chaîne de 0,

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

Cela peut être appliqué à votre problème en ajustant dynamiquement le nombre de 0 non significatifs dans une chaîne de format:

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

C'est toujours une solution compliquée, mais a l'avantage que vous pouvez spécifier la longueur totale de la chaîne résultante en utilisant un argument entier.



15

Vous pouvez utiliser ceci:

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

De loin la meilleure réponse. Apache commons StringUtils est une bibliothèque simple mais extrêmement utile.
Zoidberg

Cela a permis de gagner beaucoup de temps et c'est aussi propre et net.
Abhishek

9

J'ai été dans une situation similaire et j'ai utilisé ceci; C'est assez concis et vous n'avez pas à vous occuper de la longueur ou d'une autre bibliothèque.

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

Simple et soigné. Le format de chaîne renvoie " Apple"donc après avoir remplacé l'espace par des zéros, il donne le résultat souhaité.


Ensuite, vous souhaiterez peut-être d'abord fractionner la chaîne, appliquer l'opération ci-dessus à la première valeur de fractionnement, puis concaténer le reste des valeurs de fractionnement.
Erdi İzgi

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

Vous devrez peut-être prendre soin de l'Edgecase. C'est une méthode générique.

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

Bien que cet extrait de code soit le bienvenu et puisse fournir une aide, il serait grandement amélioré s'il incluait une explication de la façon dont il répond à la question. Sans cela, votre réponse a beaucoup moins de valeur éducative - rappelez-vous que vous répondez à la question pour les lecteurs à l'avenir, pas seulement pour la personne qui la pose maintenant! Veuillez modifier votre réponse pour ajouter une explication et donner une indication des limitations et hypothèses applicables.
Toby Speight

1

En Java:

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

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

Dans Scala:

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

Vous pouvez également explorer un moyen dans Java 8 de le faire à l'aide de flux et de réduire (comme je l'ai fait avec Scala). C'est un peu différent de toutes les autres solutions et je l'aime particulièrement beaucoup.


0

C'est rapide et fonctionne pour n'importe quelle longueur.

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

Peut être plus rapide que la réponse de Chris Lercher lorsque la plupart des éléments de String ont exactement 8 caractères

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

dans mon cas sur ma machine 1/8 plus rapide.


0

Voici la version simple de "script lisible" sans API que j'utilise pour le pré-remplissage d'une chaîne. (Simple, lisible et réglable).

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

0

Quelqu'un a-t-il essayé cette solution Java pure (sans 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");

Malheureusement, cette solution ne fonctionne que si vous ne disposez pas d'espaces vides dans une chaîne.


0

Si vous souhaitez écrire le programme en Java pur, vous pouvez suivre la méthode ci-dessous ou il existe de nombreux String Utils pour vous aider à mieux avec des fonctionnalités plus avancées.

En utilisant une méthode statique simple, vous pouvez y parvenir comme ci-dessous.

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

Vous pouvez utiliser la méthode ci-dessus addLeadingText(length, padding text, your text)

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

La sortie serait 000Apple


-3

Ce n'est pas joli, mais ça marche. Si vous avez accès à apache commons, je vous suggère de l'utiliser

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

2
Le -1 est probablement dû au fait que ce n'est pas un très bon exemple: vous utilisez des "nombres magiques" et concaténez des chaînes, quelque chose qui devrait être remplacé en utilisant un StringBuilder ou un StringBuffer.
Bart Kiers
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.