Как отформатировать строки в Java - PullRequest
160 голосов
/ 22 июня 2011

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

"Шаг {1} из {2}"

путем подстановки переменных с использованием Java?В C # это просто.

Ответы [ 6 ]

207 голосов
/ 22 июня 2011

Взгляните на 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 ) по своему вкусу.

128 голосов
/ 22 июня 2011

В дополнение к 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) });
6 голосов
/ 24 апреля 2017

Я написал свой простой метод для этого:

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");
5 голосов
/ 07 февраля 2017
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 дополняет наше целое число до 0 слева
  • 3 делает наше целое число минимальной длиной 3
4 голосов
/ 22 июня 2011

Если вы решите не использовать 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))) и легче читать.

1 голос
/ 15 января 2018

Это решение сработало для меня. Мне нужно было динамически создавать 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 / заказ"

...