Как использовать java.Строка.формат в Scala?
Я пытаюсь использовать .format метод строку. Но если я помещаю %1, %2 и т. д. в строке, java.утиль.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));
}
}
из этого я понимаю, что % char запрещено. Если да, то что я должен использовать для заполнителей аргументов?
Я использую Скала 2.8.
11 ответов:
хотя все предыдущие ответы верны, они все на Java. Вот пример Scala:
val placeholder = "Hello %s, isn't %s cool?" val formatted = placeholder.format("Ivan", "Scala")у меня также есть сообщение в блоге о делая
formatкак в Python%оператор это может быть полезно.
вам не нужно использовать номера для указания позиционирования. По умолчанию позиция аргумента-это просто порядок, в котором он отображается в строке.
вот пример правильного использования этого:
String result = String.format("The format method is %s!", "great"); // result now equals "The format method is great!".вы всегда будете использовать
%следуют некоторые другие символы, чтобы метод знал, как он должен отображать строку.%s- пожалуй, наиболее распространенным, и это просто означает, что аргумент должен рассматриваться как строка.Я не буду перечислять все варианты, но я приведу несколько примеров, чтобы дать вам представление:
// we can specify the # of decimals we want to show for a floating point: String result = String.format("10 / 3 = %.2f", 10.0 / 3.0); // result now equals "10 / 3 = 3.33" // we can add commas to long numbers: result = String.format("Today we processed %,d transactions.", 1000000); // result now equals "Today we processed 1,000,000 transactions."
String.formatпросто используетjava.util.Formatter, поэтому для полного описания опций вы можете посмотреть форматер javadocs.и, как BalusC сказал, Вы увидите в документации, что можно изменить порядок аргументов по умолчанию, если вам нужно. Однако, вероятно, единственный раз, когда вам нужно / нужно сделать это, если вы используете один и тот же аргумент не раз.
вместо того чтобы смотреть на исходный код, вы должны прочитать документацию javadoc строку.формат() и форматер синтаксис.
вы указываете формат значения после %. Например, для десятичного целого это
d, а для строки этоs:String aString = "world"; int aInt = 20; String.format("Hello, %s on line %d", aString, aInt );выход:
Hello, world on line 20чтобы сделать то, что вы пытались (использовать индекс аргумента), вы используете:
*n*$,String.format("Line:%2$d. Value:%1$s. Result: Hello %1$s at line %2$d", aString, aInt );выход:
Line:20. Value:world. Result: Hello world at line 20
также обратите внимание, что Scala расширяет строку с помощью ряда методов (через неявное преобразование в обернутую строку, введенную Predef), поэтому вы также можете сделать следующее:
val formattedString = "Hello %s, isn't %s cool?".format("Ivan", "Scala")
официальная ссылка-это класс
Formatter.
Это список того, что
String.formatможно сделать. То же самое касаетсяprintfint i = 123; o.printf( "|%d|%d|%n" , i, -i ); // |123|-123| o.printf( "|%5d|%5d|%n" , i, -i ); // | 123| –123| o.printf( "|%-5d|%-5d|%n" , i, -i ); // |123 |-123 | o.printf( "|%+-5d|%+-5d|%n" , i, -i ); // |+123 |-123 | o.printf( "|%05d|%05d|%n%n", i, -i ); // |00123|-0123| o.printf( "|%X|%x|%n", 0xabc, 0xabc ); // |ABC|abc| o.printf( "|%04x|%#x|%n%n", 0xabc, 0xabc ); // |0abc|0xabc| double d = 12345.678; o.printf( "|%f|%f|%n" , d, -d ); // |12345,678000| |-12345,678000| o.printf( "|%+f|%+f|%n" , d, -d ); // |+12345,678000| |-12345,678000| o.printf( "|% f|% f|%n" , d, -d ); // | 12345,678000| |-12345,678000| o.printf( "|%.2f|%.2f|%n" , d, -d ); // |12345,68| |-12345,68| o.printf( "|%,.2f|%,.2f|%n" , d, -d ); // |12.345,68| |-12.345,68| o.printf( "|%.2f|%(.2f|%n", d, -d ); // |12345,68| |(12345,68)| o.printf( "|%10.2f|%10.2f|%n" , d, -d ); // | 12345,68| | –12345,68| o.printf( "|%010.2f|%010.2f|%n",d, -d ); // |0012345,68| |-012345,68| String s = "Monsterbacke"; o.printf( "%n|%s|%n", s ); // |Monsterbacke| o.printf( "|%S|%n", s ); // |MONSTERBACKE| o.printf( "|%20s|%n", s ); // | Monsterbacke| o.printf( "|%-20s|%n", s ); // |Monsterbacke | o.printf( "|%7s|%n", s ); // |Monsterbacke| o.printf( "|%.7s|%n", s ); // |Monster| o.printf( "|%20.7s|%n", s ); // | Monster| Date t = new Date(); o.printf( "%tT%n", t ); // 11:01:39 o.printf( "%tD%n", t ); // 04/18/08 o.printf( "%1$te. %1$tb%n", t ); // 18. Apr
вот список форматеров, используемых со строкой.формат()
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
хотя @Londo упомянул строковый интерполятор Scala "s", Я думаю, что Scala строковый интерполятор"f" больше относится к исходному вопросу. Пример, используемый несколько раз в других ответах, также может быть написан (начиная с Scala 2.10) следующим образом:
scala> val name = "Ivan" name: String = Ivan scala> val thing = "Scala" thing: String = Scala scala> val formatted = f"Hello $name%s, isn't $thing%s cool?" formatted: String = Hello Ivan, isn't Scala cool?связь с исходным вопросом заключается в том, чтобы знать, что:
formattedопределяется строкой с префиксом "f". Это строка" f " (форматирование) интерполятор.- строковый интерполятор "f" использует
java.util.Formatterjava.lang.String.formatиспользуетjava.util.Formatterхорошая вещь о Строковой интерполяции заключается в том, что она позволяет увидеть, какая переменная подставляется непосредственно в строку вместо того, чтобы сопоставлять ее с аргументами
String.formatметод.
в scala, для Строковой интерполяции у нас есть $ это спасает день и делает нашу жизнь намного проще:
Например: вы хотите определить функцию, которая принимает имя ввода и возраст и говорит Привет с именем и говорит свой возраст. Это можно написать так:
def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is $age"следовательно, когда вы вызываете эту функцию: вот так:
funcStringInterpolationDemo("Shivansh",22)результаты :
Hey ! my name is Shivansh and my age is 22вы можете написать код, чтобы изменить его в та же строка, например, если вы хотите добавить 10 лет к возрасту !
тогда функция может быть:
def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is ${age+10}"и теперь выход будет:
Hey ! my name is Shivansh and my age is 32
Comments