Примитивный вопрос, но как мне отформатировать строки так:
«Шаг {1} из {2}»
путем замены переменных с помощью Java? В C # это легко.
Примитивный вопрос, но как мне отформатировать строки так:
«Шаг {1} из {2}»
путем замены переменных с помощью Java? В C # это легко.
Ответы:
В дополнение к String.format, также посмотрите 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) });
MessageFormat.format("Number {0}", 1234));
зависимости от локали по умолчанию может выдавать Number 1,234
вместо Number 1234
.
{0} it ll take firstname
, когда {1} then lastname
, как это так. Это возможно как- {0,choice,0.getFirstName()}
то так?
Посмотрите на String.format . Однако обратите внимание, что он принимает спецификаторы формата, аналогичные спецификациям семейства функций printf в C - например:
String.format("Hello %s, %d", "world", 42);
Вернул бы "Привет мир, 42". Вы можете найти это полезно при изучении спецификаторов формата. Энди Томас-Крамер был достаточно любезен, чтобы оставить эту ссылку в комментарии ниже, который указывает на официальную спецификацию. Наиболее часто используемые из них:
Это радикально отличается от C #, который использует позиционные ссылки с необязательным спецификатором формата. Это означает, что вы не можете делать такие вещи, как:
String.format("The {0} is repeated again: {0}", "word");
... без фактического повторения параметра, переданного в printf / format. (см. комментарий The Scrum Meister ниже)
Если вы просто хотите напечатать результат напрямую, вы можете найти System.out.printf ( PrintStream.printf ) по своему вкусу.
String.format
также могут занимать числовые позиции: String.format("%2$s %1$s", "foo", "bar");
будут выводитьсяbar foo
Если вы решите не использовать String.format, другой вариант - двоичный оператор +
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)))
и легче читать.
+
работает оператор. 2) Ваше объяснение даже не точное. +
эквивалентно использованию StringBuilder
, а не String.concat
. (Слишком много информации об этом.)
Я написал свой простой метод для этого:
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
Это решение сработало для меня. Мне нужно было динамически создавать 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 / заказ"
Я написал эту функцию, она делает все правильно. Интерполируйте слово, начинающееся со $
значения переменной с тем же именем.
private static String interpol1(String x){
Field[] ffield = Main.class.getDeclaredFields();
String[] test = x.split(" ") ;
for (String v : test ) {
for ( Field n: ffield ) {
if(v.startsWith("$") && ( n.getName().equals(v.substring(1)) )){
try {
x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
}catch (Exception e){
System.out.println("");
}
}
}
}
return x;
}