Ich versuche, eine .format
Methode eines Strings zu verwenden. Wenn ich jedoch% 1,% 2 usw. in die Zeichenfolge einfüge, wird java.util.UnknownFormatConversionException ausgelöst, die auf ein verwirrendes Java-Quellcodeteil verweist:
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));
}
}
Daraus verstehe ich, dass %
Saibling verboten ist. Wenn ja, was soll ich dann für Argumentplatzhalter verwenden?
Ich benutze Scala 2.8.
format
direkt auf das Zeichenfolgenliteral anwenden :"Hello %s, isn't %s cool?".format("Ivan", "Scala")
Sie müssen keine Zahlen verwenden, um die Positionierung anzuzeigen. Standardmäßig ist die Position des Arguments einfach die Reihenfolge, in der es in der Zeichenfolge angezeigt wird.
Hier ist ein Beispiel für die richtige Verwendung:
Sie werden immer ein
%
gefolgt von einigen anderen Zeichen verwenden, um der Methode mitzuteilen, wie die Zeichenfolge angezeigt werden soll.%s
ist wahrscheinlich die häufigste und bedeutet nur, dass das Argument als Zeichenfolge behandelt werden sollte.Ich werde nicht jede Option auflisten, aber ich werde ein paar Beispiele geben, um Ihnen eine Idee zu geben:
String.format
verwendet nur ajava.util.Formatter
, sodass Sie für eine vollständige Beschreibung der Optionen die Formatter-Javadocs sehen können .Und wie BalusC erwähnt, sehen Sie in der Dokumentation, dass Sie die Standardargumentreihenfolge bei Bedarf ändern können. Wahrscheinlich müssen / möchten Sie dies jedoch nur tun, wenn Sie dasselbe Argument mehrmals verwenden.
quelle
Anstatt den Quellcode zu betrachten, sollten Sie die Syntax javadoc String.format () und Formatter lesen .
Sie geben das Format des Werts nach% an. Zum Beispiel für eine dezimale Ganzzahl
d
und für einen Strings
:Ausgabe:
Um das zu tun, was Sie versucht haben (verwenden Sie einen Argumentindex), verwenden Sie :
*n*$
,Ausgabe:
quelle
Sie können dies verwenden;
Ausgabe:
quelle
{0}
und{1}
anstelle von%1$
und%2$
.Beachten Sie auch, dass Scala String mit einer Reihe von Methoden erweitert (durch implizite Konvertierung in einen von Predef eingebrachten WrappedString), sodass Sie auch Folgendes tun können:
quelle
Die offizielle Referenz ist die Klasse
Formatter
.quelle
In Scala 2.10
quelle
printf
, Sie könnten sogar Ihre eigene Interpolation definieren (ich habe nicht Versuchen). Das$name
bedeutet, dass es durch den Wert der Variablen ersetzt werden mussname
, Sie könnten auch Operation in der Interpolation ausführen, zum Beispiels"Hello ${name.toUpperCase}, it's $weather today!"
Dies ist eine Liste der Möglichkeiten
String.format
. Das gleiche gilt fürprintf
quelle
Hier ist eine Liste der mit String.format () verwendeten Formatierer
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
quelle
Obwohl @Londo Scalas "s" -Stringinterpolator erwähnte, denke ich, dass Scalas "f" -Stringinterpolator für die ursprüngliche Frage relevanter ist. Das Beispiel, das einige Male in anderen Antworten verwendet wurde, könnte auch (seit Scala 2.10) folgendermaßen geschrieben werden:
Die Verbindung zur ursprünglichen Frage ist zu beachten, dass:
formatted
wird mit einer Zeichenfolge definiert, der der Buchstabe "f" vorangestellt ist. Dies ist der String-Interpolator "f" (Formatierung).java.util.Formatter
java.lang.String.format
verwendet das gleichejava.util.Formatter
Das Schöne an der String-Interpolation ist, dass Sie sehen können, welche Variable direkt in den String eingefügt wird, anstatt sie mit den Argumenten der
String.format
Methode abgleichen zu müssen .quelle
In Scala haben wir für die String-Interpolation $ , das den Tag rettet und unser Leben viel einfacher macht:
Zum Beispiel: Sie möchten eine Funktion definieren, die den Eingabenamen und das Alter übernimmt und Hallo sagt. Mit dem Namen und dem Alter. Das kann so geschrieben werden:
Wenn Sie diese Funktion aufrufen: So:
Seine Ausgabe wäre:
Sie können den Code schreiben, um ihn in derselben Zeile zu ändern, beispielsweise wenn Sie dem Alter 10 Jahre hinzufügen möchten!
dann könnte die Funktion sein:
Und jetzt wäre die Ausgabe:
quelle