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