Формат сообщения в Java и как его повторить в Голанге - PullRequest
0 голосов
/ 08 октября 2018

Вот код 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 Ответ

0 голосов
/ 08 октября 2018

Подробно в 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).

InПерейдите к форматированию целого числа, вы можете просто использовать глагол %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"
...