在 Java 中,如何将长整数格式化为不带分隔符的字符串?

这个问题很简单,但我敢打赌,在这里询问可能比试图理解 MessageFormat的文档更直接:

long foo = 12345;
String s = MessageFormat.format("{0}", foo);

观测值为“12,345”。

期望值是“12345”。

64401 次浏览
MessageFormat.format("{0,number,#}", foo);

作为一个替代 String.formatjava.util.Formatter可能为您工作以及..。

你可以试试:

String s = new Long(foo).toString();

最近的路是

long foo = 12345;
String s = ""+foo;

在尝试使用国际化等方法处理“真实世界”模式时,我有点纠结于这个问题。具体来说,我们需要使用一种“选择”格式,其中输出取决于所显示的值,这就是 java.text.ChoiceFormat的用途。

这里有一个例子来说明如何做到这一点:

    MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");


int[] nums = new int[] {
0,
1,
100,
1000,
10000,
100000,
1000000,
10000000
};


Object[] a = new Object[1];
for(int num : nums) {
a[0] = num;
System.out.println(fmt.format(a));
}

这将产生以下输出; 我希望这对其他试图完成同样类型事情的人有所帮助:

zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000

正如您所看到的,“选择”格式允许我们根据传入的要格式化的值来选择要使用的格式类型。小数字可以替换为文本(不显示原始值)。中等大小的数字没有分组分隔符(没有逗号)。最大的数字还是包括逗号。显然,这是一个完全人为设计的示例,用于演示 java.text.MessageFormat的灵活性。

关于格式文本中引用的 #的注意事项: 由于同时使用了 ChoiceFormatMessageFormat,因此两者之间的元字符之间存在冲突。ChoiceFormat使用 #作为元字符,本质上意味着“等于”,这样格式化引擎就知道,例如,在 1#one!的情况下,我们正在比较 {0}1,如果它们是相等的,它使用特定的“选择”。

但是 #对于 MessageFormat还有另一层含义,那就是对于 DecimalFormat有意义的元字符: 它是一个元字符,意思是“在这里放一个数字”。

因为它包装在 ChoiceFormat字符串中,所以需要引用 #。当 ChoiceFormat完成对字符串的解析时,在将子格式传递给 MessageFormat(然后再传递给 DecimalFormat)时,这些引号将被删除。

因此,当您使用 {0,choice,...}时,您必须引用这些 #字符,可能还有其他字符。