将整数转换为带有千位分隔符的字符串

212

我想把整数35634646转换成千分位形式,也就是35,634,646。

最快的方法是什么?

15个回答

325
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(35634646));
Output: 35,634,646

6
我需要添加 import java.text.NumberFormat; - Mike S
6
这迫使使用逗号 , 进行分组的美式风格,然而也有一些地区使用句点 . 来进行分组。总之,硬编码一个本地化设置被认为是一个不良惯例。 - Hai Zhang
4
要做好这件事,可以使用Locale.getCurrent()来解决。 - Roger RV
@RogerRV 在 Android 上没有 Locale.getCurrent() 方法。 - E.Akio
这并不是最好的答案,对于那些不生活在美国的96%的人来说。 - fig
@MikeS 我不得不在 getNumberInstance(Locale.JP) 中添加日本本地化... 这样正确吗?对我来说它没有起作用。 - Foram

166

你说希望最快的方式,但也许你指的是“最好的”、“正确的”或“典型的”?

你还要求用逗号表示千位分隔符,但也许你的意思是“根据用户本地惯例以通常人类可读的形式呈现”?

你可以这样做:

    int i = 35634646;
    String s = NumberFormat.getIntegerInstance().format(i);

美国人将获得"35,634,646"

德国人将获得"35.634.646"

瑞士德语区的人将获得"35'634'646"


我在哪里可以获取每个区域设置的数字模式?我尝试阅读代码,但无法找到它的位置。 - nhoxbypass

98
int bigNumber = 1234567;
String formattedNumber = String.format("%,d", bigNumber);

7
注意:这实现了特定于语言环境的分组。 http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#dnum - adam.r
6
我喜欢这种不太冗长的方法,而不是使用NumberFormat。 - Stu Thompson

57

整数:

int value = 100000; 
String.format("%,d", value); // outputs 100,000

双打:

double value = 21403.3144d;
String.format("%,.2f", value); // outputs 21,403.31

String.format 功能强大。

- 根据psuzzi的反馈进行了编辑。


1
优点:没有“new”,不会像DecimalFormat一样加载垃圾收集器。 - Contango
1
看一下 String.format。它以 return new Formatter(l) ... 开始等等。因此,垃圾收集器参数并不像它看起来的那样强大。 - Scheintod
3
这是我最喜欢的答案,问题要求使用整数,所以这里是代码: int value = 100000; String.format("%,d", value); - psuzzi
1
我喜欢这个。 - Sam Chen

21
 int value = 35634646;
 DecimalFormat myFormatter = new DecimalFormat("#,###");
 String output = myFormatter.format(value);
 System.out.println(output);

输出:35,634,646


1
您的模式不需要超过#,###,如果您想要欧洲风格的格式,则可以使用#,##,### - Ali
8
@Ali:你所描述的格式只在印度使用,我至少90%确定印度不在欧洲。 - Cairnarvon
我明白了...好的,如果你需要印度格式,那就这样做。 - Ali
1
这是与本地环境相关的,如果在默认语言环境不使用“,”分隔千位数,则无法产生正确(根据问题)的输出。 - antak

18

其他答案是正确的,不过在使用"%,d"之前,请仔细检查您的区域设置:

Locale.setDefault(Locale.US);
int bigNumber = 35634646;
String formattedNumber = String.format("%,d", bigNumber);
System.out.println(formattedNumber);

Locale.setDefault(new Locale("pl", "PL"));
formattedNumber = String.format("%,d", bigNumber);
System.out.println(formattedNumber);

结果:

35,634,646
35 634 646

6

使用扩展

import java.text.NumberFormat

val Int.commaString: String
  get() = NumberFormat.getInstance().format(this)

val String.commaString: String
  get() = NumberFormat.getNumberInstance().format(this.toDouble())

val Long.commaString: String
  get() = NumberFormat.getInstance().format(this)

val Double.commaString: String
  get() = NumberFormat.getInstance().format(this)

结果

1234.commaString => 1,234
"1234.456".commaString => 1,234.456
1234567890123456789.commaString => 1,234,567,890,123,456,789
1234.456.commaString => 1,234.456

4
这个解决方案对我有用:
NumberFormat.getNumberInstance(Locale.US).format(Integer.valueOf("String Your Number"));

4

使用带逗号的 %d 格式说明符:%,d

这是目前最简单的方法。


1

对于那些无法访问"numberformat"或"String.format"(在框架内使用Java的限制版本)的人,这里有一个解决方案。希望它有用。

number= 123456789;
thousandsSeparator=",";
myNumberString=number.toString();   
numberLength=myNumberString.length;
howManySeparators=Math.floor((numberLength-1)/3)
formattedString=myNumberString.substring(0,numberLength-(howManySeparators*3))
while (howManySeparators>0)    {
formattedString=formattedString+thousandsSeparator+myNumberString.substring(numberLength-(howManySeparators*3),numberLength-((howManySeparators-1)*3));
howManySeparators=howManySeparators-1;    }

formattedString

考虑编辑您的答案,为您的代码添加一些注释(或者将其封装在一个方法中,使其更有用)。 - noiaverbale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接