Как форматировать строки в Java

Первобытный вопрос, но как мне форматировать строки следующим образом:

«Шаг {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 немного приятнее для 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 / заказ”

    Interesting Posts

    Изменение значков на панели задач Windows 7

    Как изменить значение process.env.PORT в node.js?

    Как рассчитать или аппроксимировать медиану списка без сохранения списка

    Пакетное слияние / mux .srt с .mkv файлами

    Разница между + и & для присоединения строк в VB.NET

    Поиск всех циклов в неориентированных графах

    Строка ggplot2 дает «geom_path: каждая группа состоит только из одного наблюдения. Вам нужно настроить группу эстетики? “

    округлить до 2 десятичных знаков в java?

    Захват видеоэкрана, который поддерживает виртуальный рабочий стол

    Как клиент WiFi выбирает AP, если два имеют одинаковый SSID?

    Как запустить CMD.exe под учетной записью локальной системы?

    Какое распределение вы получаете от этой случайной случайной перетасовки?

    Boost async_ * функции и shared_ptr’s

    Inno Setup: как автоматически удалить предыдущую установленную версию?

    Как изменить длинные имена файлов (созданные в Linux) в Windows?

    Давайте будем гением компьютера.