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


122

这个问题很简单,但是我敢打赌,在这里询问可能比尝试理解有关以下内容的文档更为直接MessageFormat

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

观察值为“ 12,345”。

期望值为“ 12345”。

Answers:


62

12
String.valueOf(long)
rsp

6
String.valueOf()调用Long.toString()
彼得·

7
也许这很麻烦,但是在这种情况下,您所依赖的是Long.toString(foo)的未记录行为。因此,我更喜欢Daniel Fortunov的回答。
约翰·K

4
它不是没有证件的。参见download.oracle.com/javase/6/docs/api/java/lang/…
罗伯H

3
是的,但是此解决方案不适用于ResourceBundle中的消息格式。Tuto i18n
Guillaume Husta 2015年

332
MessageFormat.format("{0,number,#}", foo);

1
谢谢,我试图通过MessageFormat属性注入来实现这一点。好东西有多种方法可以做到!
Philihp Busby 2011年

3
我更喜欢这种方式。因为它允许我更改语言属性文件中的格式。
Pascal

2
完美的解决方案!帮助我在参考数据中而不是代码级别保留format / unformat选项-谢谢!正如@SebastianRoth所说-这应该是公认的答案。
Ofer Lando 2015年

9
我实际上很惊讶为什么用格式化程序API将数字字符串设置为默认值而不是显式的东西
humblerookie

1
如果您引用以下模式,这也可以在选择格式内使用:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO

1

在尝试通过国际化等方式创建“现实世界”模式时,我为此付出了一些努力。具体地说,我们需要使用“选择”格式,其中输出取决于所显示的值,这就是为什么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,...},必须引用那些#字符,甚至可能还要引用其他字符。


0

最短的方法是

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

3
而且,像往常一样,它会扩展到new StringBuilder("").append(foo).toString()真正并非最佳的状态。
RAnders00 '16

1
@ RAnders00将数字转换为单个字符串不太可能是最佳选择,具体取决于上下文,您通常可以完全避免使用它,但是对于最简单的模式,您可以使用""+
Peter Lawrey

1
您是对的,但我只是想指出这一点,因为人们总是倾向于指出这一点。
RAnders00 '16

1
使用消息格式的@ RAnders00 btw昂贵一个数量级,并且在这种情况下更复杂。
彼得·劳瑞

是的,应该改用Long.toString()它,因为无论如何这都是该解决方案在后台使用的方法:)
RAnders00 '16


-6

您可以尝试:

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

8
不必要的对象创建。切勿将new与包装器类一起使用。
凯基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.