Формат сообщения в Java и как его повторить в Голанге

Вот код Java:

AtomicInteger obIndex = new AtomicInteger(0);
MessageFormat.format("{0,number,#},{1},{2},{3},\"{4}\"",
    obIndex.getAndIncrement(),
    "5bb2b35c67525f9e845648df370652b8",
    "Vm:vm-289",
    "1.1.1.1:113",
    "ABC-Testvm-1");

Выход:

0,5bb2b35c67525f9e845648df370652b8,Vm:vm-289,1.1.1.1:113,"ABC-Testvm-1"

Я попробовал это в Go:

value := fmt.Sprintf("%d,%s,%s,%s,%s",
    0,
    "5bb2b35c67525f9e845648df370652b8",
    "Vm:vm-289",
    "1.1.1.1:113", "ABC-Testvm-1")
fmt.Println(value)

Какие выводы:

0,5bb2b35c67525f9e845648df370652b8,Vm:vm-289,1.1.1.1:113,ABC-Testvm-1

Какое значение имеет {0,number,#} и как я могу получить то же самое в Go?

1 ответ

Решение

Это подробно на java.text.MessageFormat, Строка, которую вы передаете MessageFormat.format() это шаблон. Шаблон состоит из элементов формата. Форма элемента формата:

 FormatElement:
         { ArgumentIndex }
         { ArgumentIndex , FormatType }
         { ArgumentIndex , FormatType , FormatStyle }

Итак, в первом элементе формата:

{0,number,#}

0 это индекс аргумента, значение которого нужно отформатировать.

number это тип формата, и # это стиль формата, более конкретно шаблон подформата. Это означает, что аргумент будет отформатирован с использованием подформата:

new DecimalFormat(subformatPattern, DecimalFormatSymbols.getInstance(getLocale()))

# подформат описан в java.text.DecimalFormat, Это просто означает не использовать дробные цифры, только отображать его как целое число, и если оно не является целым числом, оно будет округлено (используя RoundingMode.HALF_EVEN Режим).

В Go, чтобы отформатировать целое число, вы можете просто использовать %d как глагол, который даст тот же формат вывода для целых чисел. Если число является числом с плавающей запятой, это не будет работать (%d может использоваться только для целых чисел). Если число является числом с плавающей запятой, используйте %f глагол, более конкретно %.0f сказать ему округлить до целого числа или кратчайшей формы %.f,

Также ваша версия Java помещает последний аргумент в двойные кавычки, поэтому вы должны сделать то же самое в Go.

value := fmt.Sprintf("%d,%s,%s,%s,\"%s\"",
    0,
    "5bb2b35c67525f9e845648df370652b8",
    "Vm:vm-289",
    "1.1.1.1:113", "ABC-Testvm-1")

fmt.Println(value)

Это выведет (попробуйте на Go Playground):

0,5bb2b35c67525f9e845648df370652b8,Vm:vm-289,1.1.1.1:113,"ABC-Testvm-1"
Другие вопросы по тегам