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

Ответы:

140

В дополнение к 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) });
ataylor
источник
21
MessageFormat предназначен для локализации, поэтому будьте осторожны при его использовании. Например, следующий код в MessageFormat.format("Number {0}", 1234));зависимости от локали по умолчанию может выдавать Number 1,234вместо Number 1234.
pavel_kazlou
@ataylor: Привет, извините, но я немного растерялся. Я хочу что-то подобное, я передам объект класса, который имеет данные и когда {0} it ll take firstname, когда {1} then lastname, как это так. Это возможно как- {0,choice,0.getFirstName()}то так?
user3145373 ツ
@ user3145373 ツ Я так не думаю.
Атайлор
Хорошо, хорошо, я имею в виду один проект .Net, как я хочу, codeproject.com/Articles/42310/… , ссылаюсь на этот проект, я выгляжу вот так. Если вы знаете какой-либо проект или пакеты, доступные так, пожалуйста, сообщите мне. Спасибо
пользователь3145373 ツ
233

Посмотрите на String.format . Однако обратите внимание, что он принимает спецификаторы формата, аналогичные спецификациям семейства функций printf в C - например:

String.format("Hello %s, %d", "world", 42);

Вернул бы "Привет мир, 42". Вы можете найти это полезно при изучении спецификаторов формата. Энди Томас-Крамер был достаточно любезен, чтобы оставить эту ссылку в комментарии ниже, который указывает на официальную спецификацию. Наиболее часто используемые из них:

  • % s - вставить строку
  • % d - вставить целое число со знаком (десятичное число)
  • % f - вставить действительное число, стандартное обозначение

Это радикально отличается от C #, который использует позиционные ссылки с необязательным спецификатором формата. Это означает, что вы не можете делать такие вещи, как:

String.format("The {0} is repeated again: {0}", "word");

... без фактического повторения параметра, переданного в printf / format. (см. комментарий The Scrum Meister ниже)


Если вы просто хотите напечатать результат напрямую, вы можете найти System.out.printf ( PrintStream.printf ) по своему вкусу.

Мартин Торнвалл
источник
2
Другой вариант - java.text.MessageFormat, который принимает символы формата в стиле {1}. Символы формата String.format () могут быть аналогичны символам формата printf () в C, но также могут отличаться. См. Download.oracle.com/javase/6/docs/api/java/util/… для полного синтаксиса.
Энди Томас
53
String.formatтакже могут занимать числовые позиции: String.format("%2$s %1$s", "foo", "bar");будут выводитьсяbar foo
Scrum Meister
7

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

Райан Амос
источник
5
Если вы собираетесь отречься от меня, пожалуйста, объясните, почему.
Райан Амос
11
1) В ответ на вопрос о форматировании строки вы объясните, как +работает оператор. 2) Ваше объяснение даже не точное. +эквивалентно использованию StringBuilder, а не String.concat. (Слишком много информации об этом.)
Сёрен Левборг
6

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

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
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
Вед Пракаш
источник
1
Вы правы docs.oracle.com/javase/8/docs/api/java/util/...
ℛɑƒæĿᴿᴹᴿ
1

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

Фелипе Беджарано
источник
0

Я написал эту функцию, она делает все правильно. Интерполируйте слово, начинающееся со $значения переменной с тем же именем.

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;
}
DefconT34
источник