J'essaie d'utiliser une .format
méthode de chaîne. Mais si je place% 1,% 2, etc. dans la chaîne, java.util.UnknownFormatConversionException est levée pointant vers un morceau de code source Java déroutant:
private void checkText(String s) {
int idx;
// If there are any '%' in the given string, we got a bad format
// specifier.
if ((idx = s.indexOf('%')) != -1) {
char c = (idx > s.length() - 2 ? '%' : s.charAt(idx + 1));
throw new UnknownFormatConversionException(String.valueOf(c));
}
}
D'après cela, je comprends que l' %
omble est interdit. Si oui, que dois-je utiliser pour les espaces réservés d'argument?
J'utilise Scala 2.8.
format
directement au littéral de chaîne:"Hello %s, isn't %s cool?".format("Ivan", "Scala")
Vous n'avez pas besoin d'utiliser des chiffres pour indiquer le positionnement. Par défaut, la position de l'argument est simplement l'ordre dans lequel il apparaît dans la chaîne.
Voici un exemple de la bonne façon de l'utiliser:
Vous utiliserez toujours un
%
suivi de quelques autres caractères pour indiquer à la méthode comment elle doit afficher la chaîne.%s
est probablement le plus courant, et cela signifie simplement que l'argument doit être traité comme une chaîne.Je n'énumérerai pas toutes les options, mais je donnerai quelques exemples juste pour vous donner une idée:
String.format
utilise simplement unjava.util.Formatter
, donc pour une description complète des options, vous pouvez voir les javadocs du formateur .Et, comme le mentionne BalusC, vous verrez dans la documentation qu'il est possible de modifier l'ordre des arguments par défaut si nécessaire. Cependant, probablement la seule fois où vous auriez besoin / voudriez faire ceci est si vous utilisez le même argument plus d'une fois.
la source
Au lieu de regarder le code source, vous devriez lire la syntaxe javadoc String.format () et Formatter .
Vous spécifiez le format de la valeur après le%. Par exemple, pour un entier décimal, c'est
d
pour String et c'ests
:Production:
Pour faire ce que vous avez essayé (utiliser un argument index), vous utilisez:
*n*$
,Production:
la source
Vous pouvez l'utiliser;
Production:
la source
{0}
et{1}
au lieu de%1$
et%2$
.Notez également que Scala étend String avec un certain nombre de méthodes (via une conversion implicite en une WrappedString introduite par Predef), vous pouvez donc également effectuer les opérations suivantes:
la source
La référence officielle est la classe
Formatter
.la source
Dans Scala 2.10
la source
printf
, vous pouvez même définir votre propre interpolation (je n'ai pas essayer). Les$name
moyens qu'il ont besoin d'être remplacer par la valeur de la variablename
, vous pouvez aussi effectuer certaines opérations dans l'interpolation, par exemples"Hello ${name.toUpperCase}, it's $weather today!"
Voici une liste de ce que vous
String.format
pouvez faire. Il en va de mêmeprintf
la source
Voici une liste de formateurs utilisés avec String.format ()
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
la source
Bien que @Londo ait mentionné l'interpolateur de chaîne "s" de Scala, je pense que l' interpolateur de chaîne "f" de Scala est plus pertinent pour la question d'origine. L'exemple utilisé quelques fois dans d'autres réponses pourrait également être écrit (depuis Scala 2.10) de cette façon:
Le lien avec la question d'origine est de savoir que:
formatted
est défini par une chaîne précédée de la lettre "f". Il s'agit de l'interpolateur de chaîne "f" (formatage).java.util.Formatter
java.lang.String.format
utilise le mêmejava.util.Formatter
La bonne chose à propos de l'interpolation de chaîne est qu'elle vous permet de voir quelle variable est substituée directement dans la chaîne au lieu d'avoir à la faire correspondre avec les arguments de la
String.format
méthode.la source
En scala, pour l'interpolation de chaîne, nous avons $ qui sauve la journée et nous facilite la vie:
Par exemple: Vous voulez définir une fonction qui prend le nom et l'âge d'entrée et dit Bonjour avec le nom et dit son âge. Cela peut être écrit comme ceci:
Par conséquent, lorsque vous appelez cette fonction: comme ceci:
Sa sortie serait:
Vous pouvez écrire le code pour le changer dans la même ligne, comme si vous voulez ajouter 10 ans à l'âge!
alors la fonction pourrait être:
Et maintenant, la sortie serait:
la source