Próbuję użyć .format
metody ciągu. Ale jeśli umieszczę% 1,% 2 itd. W ciągu, zostanie wygenerowany wyjątek java.util.UnknownFormatConversionException wskazujący na mylący fragment kodu źródłowego Java:
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));
}
}
Z tego rozumiem, że %
char jest zabronione. Jeśli tak, to czego powinienem użyć dla symboli zastępczych argumentów?
Używam Scali 2.8.
format
bezpośrednio do literału łańcuchowego:"Hello %s, isn't %s cool?".format("Ivan", "Scala")
Nie musisz używać liczb do wskazywania pozycji. Domyślnie pozycja argumentu jest po prostu kolejnością, w jakiej występuje w ciągu.
Oto przykład właściwego sposobu użycia tego:
Zawsze użyjesz
%
następujących po nich innych znaków, aby poinformować metodę, jak powinien wyświetlać ciąg.%s
jest prawdopodobnie najczęstszy i oznacza po prostu, że argument należy traktować jako ciąg znaków.Nie wymienię wszystkich opcji, ale podam kilka przykładów, aby dać ci pomysł:
String.format
używa po prostujava.util.Formatter
, więc dla pełnego opisu opcji możesz zobaczyć javadocs Formatera .Jak wspomina BalusC, w dokumentacji zobaczysz, że w razie potrzeby możesz zmienić domyślną kolejność argumentów. Prawdopodobnie jednak jedyny raz potrzebujesz / chcesz to zrobić, jeśli używasz tego samego argumentu więcej niż jeden raz.
źródło
Zamiast patrzeć na kod źródłowy, powinieneś przeczytać javadoc String.format () i składnię Formatera .
Format wartości określa się po%. Na przykład dla dziesiętnej liczby całkowitej
d
, a dla String jest tos
:Wynik:
Aby zrobić to, czego próbowałem (użyć indeksu argument), możesz użyć:
*n*$
,Wynik:
źródło
Możesz tego użyć;
Wynik:
źródło
{0}
i{1}
zamiast%1$
i%2$
.Zauważ też, że Scala rozszerza String na wiele metod (poprzez niejawną konwersję na WrappedString przyniesioną przez Predef), więc możesz również wykonać następujące czynności:
źródło
Oficjalnym odniesieniem jest klasa
Formatter
.źródło
W Scali 2.10
źródło
printf
, można nawet zdefiniować własną interpolację (ja nie próbować). Te$name
środki, które to muszą być zastąpić wartości zmiennejname
, można również wykonać operację w interpolacji, na przykłads"Hello ${name.toUpperCase}, it's $weather today!"
To jest lista tego, co
String.format
można zrobić. To samo dotyczyprintf
źródło
Oto lista formatowników używanych w String.format ()
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
źródło
Chociaż @Londo wspomniało o interpolatorze ciągów „Scala ” Scali, myślę, że interpolator ciągów „Scala ” Scali jest bardziej odpowiedni do pierwotnego pytania. Przykład wykorzystany kilka razy w innych odpowiedziach można również napisać (od Scali 2.10) w ten sposób:
W związku z pierwotnym pytaniem należy pamiętać, że:
formatted
jest zdefiniowany za pomocą ciągu znaków poprzedzonego literą „f”. To jest interpolator napisów „f” (formatowanie).java.util.Formatter
java.lang.String.format
używa tego samegojava.util.Formatter
Zaletą interpolacji łańcuchów jest to, że pozwala zobaczyć, która zmienna jest podstawiana bezpośrednio w łańcuch, bez konieczności dopasowywania jej z argumentami do
String.format
metody.źródło
W scala, na interpolację łańcuchów mamy $, który oszczędza dzień i ułatwia nam życie:
Na przykład: Chcesz zdefiniować funkcję, która pobiera nazwę wejściową i wiek oraz mówi „Cześć z nazwą” i „podaje wiek”. Można to napisać w ten sposób:
Dlatego po wywołaniu tej funkcji: tak:
Jego wyniki byłyby następujące:
Możesz napisać kod, aby zmienić go w tym samym wierszu, na przykład, jeśli chcesz dodać 10 lat do wieku!
funkcja może być:
A teraz wynik będzie:
źródło