Формат сообщения в 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"