Я пытаюсь использовать .format
метод строки. Но если я помещаю% 1,% 2 и т. Д. В строку, генерируется java.util.UnknownFormatConversionException, указывающее на запутанный фрагмент исходного кода 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));
}
}
Из этого я понимаю, что %
символ запрещен. Если так, то что я должен использовать для аргументов заполнителей?
Я использую Scala 2.8.
format
непосредственно к строковому"Hello %s, isn't %s cool?".format("Ivan", "Scala")
Вам не нужно использовать цифры для обозначения позиционирования. По умолчанию позиция аргумента - это просто порядок, в котором он появляется в строке.
Вот пример правильного способа использовать это:
Вы всегда будете использовать
%
сопровождаемые некоторыми другими символами, чтобы метод знал, как он должен отображать строку.%s
является, вероятно, наиболее распространенным, и это просто означает, что аргумент должен рассматриваться как строка.Я не буду перечислять все варианты, но приведу несколько примеров, чтобы дать вам представление:
String.format
просто используетjava.util.Formatter
, так что для полного описания параметров вы можете увидеть Javadocs Formatter .И, как упоминает BalusC, в документации вы увидите, что при необходимости можно изменить порядок аргументов по умолчанию. Однако, вероятно, единственный раз, когда вам понадобится / захочется это сделать, это если вы используете один и тот же аргумент более одного раза.
источник
Вместо того, чтобы смотреть на исходный код, вы должны прочитать синтаксис javadoc String.format () и Formatter .
Вы указываете формат значения после%. Например, для десятичного целого числа это так
d
, а для строкиs
:Вывод:
Для того, чтобы делать то , что вы пробовали (использовать индекс аргумента), можно использовать:
*n*$
,Вывод:
источник
Вы можете использовать это;
Вывод:
источник
{0}
и{1}
вместо%1$
и%2$
.Также обратите внимание, что Scala расширяет String рядом методов (посредством неявного преобразования в WrappedString, введенную Predef), поэтому вы также можете сделать следующее:
источник
Официальная ссылка - класс
Formatter
.источник
В Scala 2.10
источник
printf
, вы даже можете определить свою собственную интерполяцию (у меня нет пытаться). Это$name
означает, что его необходимо заменить значением переменнойname
, вы также можете выполнить операцию в интерполяции, напримерs"Hello ${name.toUpperCase}, it's $weather today!"
Это список того, что
String.format
можно сделать. То же самое касаетсяprintf
источник
Вот список форматеров, используемых с String.format ()
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
источник
Хотя @Londo упомянул строковый интерполятор Scala «s», я думаю, что строковый интерполятор Scala «f» больше относится к исходному вопросу. Пример, использованный несколько раз в других ответах, также может быть записан (начиная с Scala 2.10) следующим образом:
Связь с первоначальным вопросом заключается в том, чтобы знать, что:
formatted
определяется строкой, перед которой стоит буква "f". Это интерполятор "f" (форматирование).java.util.Formatter
java.lang.String.format
использует то же самоеjava.util.Formatter
Приятной особенностью интерполяции строк является то, что она позволяет вам видеть, какая переменная подставляется непосредственно в строку, вместо того, чтобы сопоставлять ее с аргументами
String.format
метода.источник
В scala для интерполяции строки имеем $ который экономит день и делает нашу жизнь намного проще:
Например: вы хотите определить функцию, которая принимает входное имя и возраст и говорит Hello вместе с именем и сообщает его возраст. Это можно записать так:
Следовательно, когда вы вызываете эту функцию: как это:
Его вывод будет:
Вы можете написать код, чтобы изменить его в той же строке, например, если вы хотите добавить 10 лет к возрасту!
тогда функция может быть:
И теперь результат будет:
источник