Comment formater des chaînes de caractères en Java

question Primitive, mais comment puis-je formater des chaînes comme ceci:

Étape "{1} {2}"

en remplaçant les variables par Java? En C#, c'est facile.

125
demandé sur Matthias Braun 2011-06-22 01:02:42

6 réponses

en plus de la chaîne.format, aussi jeter un oeil java.text.MessageFormat . Le format moins terne et un peu plus proche de L'exemple C# que vous avez fourni et vous pouvez l'utiliser pour l'analyse aussi bien.

par exemple:

int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));

un plus bel exemple tire profit des améliorations varargs et autoboxing en Java 1.5 et transforme ce qui précède en une simple doublure:

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");

MessageFormat est un peu plus agréable pour faire I18 plurals avec le modificateur de choix. Pour spécifier un message qui utilise correctement la forme du singulier quand une variable est 1 et au pluriel autrement, vous pouvez faire quelque chose comme ceci:

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });
105
répondu ataylor 2011-06-24 16:54:02

regardez la chaîne .format . Notez, cependant, qu'il prend des spécificateurs de format semblables à ceux de la famille de fonctions printf de C -- par exemple:

String.format("Hello %s, %d", "world", 42);

retournerait "Hello world 42". Vous pouvez trouver et utiles pour en savoir plus sur les spécificateurs de format. Andy Thomas-Cramer a eu la gentillesse de laisser ce lien dans un commentaire ci-dessous, qui semble pointer vers la spécification officielle. Les plus couramment utilisés sont:

  • %s-insérer une chaîne de caractères
  • %d - insérer un entier signé (décimal)
  • %f - insérer un nombre réel, la notation standard

c'est radicalement différent de C#, qui utilise des références de position avec un spécificateur de format optionnel. cela signifie que vous ne pouvez pas faire des choses comme:

String.format("The {0} is repeated again: {0}", "word");

... sans répéter le paramètre passé au format printf/. (voir le commentaire de Scrum Meister's ci-dessous)


si vous voulez juste imprimer le résultat directement, vous pouvez trouver système.hors.printf ( PrintStream.printf ) à votre goût.

161
répondu Martin Törnwall 2016-11-08 17:42:27

j'ai écrit ma méthode simple pour cela :

public class SomeCommons {
    /** Message Format like 'Some String {0} / {1}' with arguments */
    public static String msgFormat(String s, Object... args) {
        return new MessageFormat(s).format(args);
    }
}

donc vous pouvez l'utiliser comme:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");
4
répondu Tomasz Modelski 2017-04-24 18:26:09
public class StringFormat {

    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("================================");
            for(int i=0;i<3;i++){
                String s1=sc.next();
                int x=sc.nextInt();
                System.out.println(String.format("%-15s%03d",s1,x));
            }
            System.out.println("================================");

    }
}

outpot "================================"

ved15space123 ved15space123 ved15space123 "================================

solution Java

  • le " - "est utilisé pour le tiret gauche

  • le" 15 " rend la longueur minimale de la chaîne qu'il prend est 15

  • le" s " (qui est de quelques caractères après %) sera remplacé par notre chaîne de caractères
  • le 0 pads notre entier avec 0s sur la gauche
  • le 3 rend notre entier être une longueur minimum de 3
4
répondu Ved Prakash 2017-06-27 01:41:49

si vous choisissez de ne pas utiliser String.format, l'autre option est l'opérateur binaire +

String str = "Step " + a + " of " + b;

C'est l'équivalent de

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

selon votre choix. StringBuilder est plus rapide, mais la différence de vitesse est marginale. Je préfère utiliser l'opérateur + (qui fait un StringBuilder.append(String.valueOf(X))) et le trouve plus facile à lire.

3
répondu Ryan Amos 2016-05-17 19:24:01

Cette solution a fonctionné pour moi. J'avais besoin de créer des urls pour un client REST de façon dynamique donc j'ai créé cette méthode, donc vous avez juste à passer le restURL comme ceci

/customer/{0}/user/{1}/order

et ajouter autant de params que vous avez besoin:

public String createURL (String restURL, Object ... params) {       
    return new MessageFormat(restURL).format(params);
}

il suffit d'appeler cette méthode comme ceci:

createURL("/customer/{0}/user/{1}/order", 123, 321);

La sortie

"/client/123/utilisateur/321/commande"

1
répondu Felipe Bejarano 2018-01-15 00:38:41