java 中的消息格式以及如何在 Golang 中复制相同的格式
Message format in java and how to replicate the same in Golang
这是 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 中获得相同的值?
这在 java.text.MessageFormat
. The string you pass to MessageFormat.format()
中有详细说明,是 模式 。一个模式由 格式元素 组成。格式元素的形式是:
FormatElement:
{ ArgumentIndex }
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }
所以在第一个格式元素中:
{0,number,#}
0
是要格式化其值的参数索引。
number
是格式类型,#
是格式样式,更具体地说是 子格式模式 。这意味着参数将使用以下子格式进行格式化:
new DecimalFormat(subformatPattern, DecimalFormatSymbols.getInstance(getLocale()))
#
子格式在 java.text.DecimalFormat
. It simply means to not use fraction digits, only display it as an integer, and if it is not an integer, it will be rounded (using the 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"
这是 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 中获得相同的值?
这在 java.text.MessageFormat
. The string you pass to MessageFormat.format()
中有详细说明,是 模式 。一个模式由 格式元素 组成。格式元素的形式是:
FormatElement:
{ ArgumentIndex }
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }
所以在第一个格式元素中:
{0,number,#}
0
是要格式化其值的参数索引。
number
是格式类型,#
是格式样式,更具体地说是 子格式模式 。这意味着参数将使用以下子格式进行格式化:
new DecimalFormat(subformatPattern, DecimalFormatSymbols.getInstance(getLocale()))
#
子格式在 java.text.DecimalFormat
. It simply means to not use fraction digits, only display it as an integer, and if it is not an integer, it will be rounded (using the 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"