web-dev-qa-db-fra.com

Comment formater des chaînes dans Java

Question primitive, mais comment formater des chaînes comme ceci:

"Étape {1} de {2}"

en substituant des variables en utilisant Java? En C #, c'est facile.

164
katit

En plus de String.format, jetez également un oeil Java.text.MessageFormat . Le format est moins concis et plus proche de l’exemple C # que vous avez fourni et vous pouvez également l’utiliser pour l’analyse.

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 exemple plus intéressant tire parti des améliorations apportées par varargs et auto-sélection dans Java 1.5 et transforme ce qui précède en une ligne:

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

MessageFormat est un peu plus pratique pour créer des pluriels in-lisés avec le modificateur de choix. Pour spécifier un message qui utilise correctement la forme singulière lorsqu'une variable est 1 et le pluriel sinon, 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) });
_
132
ataylor

Jetez un oeil à String.format . Notez cependant qu'il faut des spécificateurs de format similaires à ceux de la famille de fonctions printf de C - par exemple:

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

Je retournerais "Bonjour tout le monde, 42". Vous pouvez trouver this utile pour en savoir plus sur les spécificateurs de format. Andy Thomas-Cramer a eu la gentillesse de laisser le lien ceci dans un commentaire ci-dessous, qui semble pointer vers la spécification officielle. Les plus couramment utilisés sont:

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

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

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

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


Si vous souhaitez simplement imprimer le résultat directement, vous pouvez trouver System.out.printf ( PrintStream.printf ) à votre guise.

209
Martin Törnwall

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

afin que vous puissiez l'utiliser comme:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");
6
Tomasz Modelski
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 retrait gauche

  • Le "15" fait que la longueur minimum du String soit de 15

  • Le "s" (qui est quelques caractères après%) sera remplacé par notre chaîne
  • Le 0 remplit notre entier avec 0 à gauche
  • Le 3 fait que notre entier soit une longueur minimum de 3
5
Ved Prakash

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

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

Ceci est l'équivalent de

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

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

4
Ryan Amos

Cette solution a fonctionné pour moi. J'avais besoin de créer des URL pour un client REST de façon dynamique, j'ai donc créé cette méthode.

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

et ajoutez autant de paramètres que nécessaire:

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

Vous devez juste appeler cette méthode comme ceci:

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

Le résultat

"/ customer/123/user/321/order"

1
Felipe Bejarano