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.
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) });
_
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:
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.
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");
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
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.
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"