Как форматировать строки в Java
примитивный вопрос, но как мне форматировать строки следующим образом:
"Шаг {1} из {2}"
путем замены переменных с помощью Java? В C# это легко.
6 ответов
В дополнение к строке.формате, также посмотреть java.text.MessageFormat
. Формат менее лаконичный и немного ближе к приведенному вами примеру C#, и вы также можете использовать его для синтаксического анализа.
например:
int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));
более хороший пример использует преимущества улучшений varargs и autoboxing в Java 1.5 и превращает вышеуказанное в однострочный:
MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");
MessageFormat
немного лучше для выполнения i18nized множественных чисел с модификатором выбора. К укажите сообщение, которое правильно использует сингулярную форму, когда переменная 1 и множественное число в противном случае, вы можете сделать что-то вроде этого:
String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });
посмотри строку.формат. Обратите внимание, однако, что он принимает спецификаторы формата, аналогичные описателям семейства функций printf C , например:
String.format("Hello %s, %d", "world", 42);
вернет "Hello world 42". Вы можете найти этой полезно при изучении спецификаторов формата. Энди Томас-Кремер был так добр, что ушел!--9-->этой ссылка в комментарии ниже, которая, как представляется, указывает на официальную спецификацию. Наиболее часто используемые являются:
- %s-вставить строку
- %d-вставить целое число со знаком (десятичное)
- %f-вставить действительное число, стандартное обозначение
это радикально отличается от C#, который использует позиционные ссылки с необязательный спецификатор формата. это означает, что вы не можете делать такие вещи, как:
String.format("The {0} is repeated again: {0}", "word");
... фактически не повторяя параметр, переданный в printf / format. (см. Scrum Комментарий мейстера ниже)
Если вы просто хотите, чтобы распечатать результат напрямую, вы можете найти системой.из.printf (PrintStream.printf) по своему вкусу.
Я написал свой простой способ для этого :
public class SomeCommons {
/** Message Format like 'Some String {0} / {1}' with arguments */
public static String msgFormat(String s, Object... args) {
return new MessageFormat(s).format(args);
}
}
Так что вы можете использовать его как:
SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");
public class StringFormat {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("================================");
for(int i=0;i<3;i++){
String s1=sc.next();
int x=sc.nextInt();
System.out.println(String.format("%-15s%03d",s1,x));
}
System.out.println("================================");
}
}
outpot "================================"
ved15space123 ved15space123 ved15space123 "================================
Java-решение
" - " используется для левого отступа
"15" делает минимальную длину строки, которая занимает 15
- "s "(который через несколько символов после %) будет заменен нашим Строка
- 0 накладывает наше целое число с 0s слева
- 3 делает наше целое число минимальной длиной 3
если вы решите не использовать строку.формат, другой вариант-оператор + binary
String str = "Step " + a + " of " + b;
Это эквивалентно
new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));
что бы вы ни использовали, это ваш выбор. StringBuilder быстрее, но разница в скорости незначительна. Я предпочитаю использовать +
оператор (который делает StringBuilder.append(String.valueOf(X)))
и найти его легче читать.
Это решение работает для меня. Мне нужно было создать URL-адреса для клиента REST динамически, поэтому я создал этот метод, поэтому вам просто нужно передать restURL так
/customer/{0}/user/{1}/order
и добавить столько параметров, сколько вам нужно:
public String createURL (String restURL, Object ... params) {
return new MessageFormat(restURL).format(params);
}
вам просто нужно вызвать этот метод следующим образом:
createURL("/customer/{0}/user/{1}/order", 123, 321);
выход
"/ клиент / 123 / пользователь/321 / заказ"