Как форматировать строки в Java
Первобытный вопрос, но как мне форматировать строки следующим образом:
«Шаг {1} из {2}”
путем замены переменных с помощью Java? На C # это легко.
- Html.DisplayFor десятичный формат?
- Именованное форматирование строк в C #
- Chart.js - Форматирование оси Y
- Как реализовать условное форматирование строк?
- Как получить 0-заполненное двоичное представление целого числа в java?
В дополнение к 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
немного приятнее для i16nized множественного числа с модификатором выбора. Чтобы указать сообщение, которое правильно использует сингулярную форму, когда переменная равно 1 и во множественном числе, вы можете сделать что-то вроде этого:
String formatString = "there were {0} {0,choice,0#objects|1#object|1
Посмотрите на String.format . Обратите внимание, однако, что он принимает спецификаторы форматирования, аналогичные свойствам семейства функций printf семейства C – например:
String.format("Hello %s, %d", "world", 42);
Вернул бы «Hello world 42». Вы можете найти это полезным при изучении спецификаторов формата. Энди Томас-Крамер был достаточно любезен, чтобы оставить эту ссылку в комментарии ниже, что, похоже, указывает на официальную спецификацию. Наиболее часто используемые:
- % s – вставить строку
- % d – вставить целое число со знаком (десятичное)
- % f – вставить реальное число, стандартную нотацию
Это радикально отличается от C #, который использует позиционные ссылки с дополнительным спецификатором формата. Это означает, что вы не можете делать такие вещи, как:
String.format("The {0} is repeated again: {0}", "word");
… без фактического повторения параметра, переданного в printf / format. (см. комментарий Scrum Meister ниже)
Если вы просто хотите распечатать результат напрямую, вы можете найти System.out.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
Если вы решите не использовать 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)))
и находит его более легким для чтения.
Это решение сработало для меня. Мне нужно было создать 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 / заказ”