如何在Java中设置千位分隔符?

176

如何在Java中设置千位分隔符?
我有一个BigDecimal的字符串表示,想要使用千位分隔符格式化并作为字符串返回。

12个回答

298
您可以使用带有逗号的 format 函数。
int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

"," 包含特定于地区的分组字符。

文档


16
如果我想使用 . 作为分隔符,该怎么办? - Enissay
1
通常我使用String.format,因为它对我来说是最好和最容易的! - Ali
27
使用明确的语言环境(Locale.US已知使用,作为分隔符)调用format()方法,然后将,替换为您自定义的分隔符: String.format(Locale.US, "%,d", n).replace(',', '.') - minipif
java.util.IllegalFormatConversionException: %d 无法格式化 java.lang.String 参数。 - Iman Marashi
3
将其转换为 int。或者 long。或者 BigInteger。如果要使用 doublefloatBigDecimal,请使用 f。 - Adowrath
显示剩余4条评论

135

这应该可以工作(未经测试,基于JavaDoc):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

根据JavaDoc文档,第一行中的强制类型转换在大多数语言环境下都是安全的。


16
这是一个未经测试的评论:getDecimalFormatSymbols() 的 Javadoc 表示:返回:所需 DecimalFormatSymbols 的副本。因此,在修改副本后,您应该使用 setDecimalFormatSymbols(theCopy) - java.is.for.desktop
6
bd.longValue()的文档说“任何小数部分都将被舍弃”。因此,如果您关心精度,我不知道这是否是最佳方法。 - codinguser
2
我猜你可以使用 new 并将其设置回格式化程序:`DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();` `customSymbol.setDecimalSeparator(decimalSeperator.charAt(0));` `customSymbol.setGroupingSeparator(thousandSeperator);` `formatter.setDecimalFormatSymbols(customSymbol);` - Lee Yi Hong
2
我认为您应该使用\u00a0(不间断空格)作为分组分隔符。这是某些语言环境的默认设置。 - ACV
5
为什么要调用longValue?问题是为BigDecimal设置千位分隔符,而不是long。 - FINDarkside

64
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

编辑

要获取自定义的分组分隔符(如空格),请按照以下步骤操作:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));

我知道我需要使用DecimalFormatSymbols setGroupingSeparator,但我不知道如何将其应用于我的BigDecimal。 - Funtime
1
@Funtime:你不需要“在BigDecimal上应用它”。你需要使用所需属性构建一个NumberFormat对象,并使用该对象格式化你的BigDecimalBigDecimal只有一个指定的值,没有指定的格式。 - Joachim Sauer
1
请注意,千位分隔符通常是一个不间断空格(如果它是一个空格)。 - cquezel
必须更改第二个选项中的顶部行为DecimalFormatSymbols symbols = new DecimalFormatSymbols();才能使其正常工作。 - PaperThick

25

如果您在使用整数数据类型时需要千位分隔符,请使用1。

1. 对于整数数据类型

String.format("%,d\n", 58625)

输出:

58,625

2. 对于浮点数数据类型

String.format("%,.2f",58625.21)

输出:

58,625.21

1
这是一个顿悟。但是,你必须强调的是,","只是一个标志,而不是它用作分组分隔符的字符。 (花了我一些时间才找到问题。)请参阅https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html。 - Vankog

22

尝试使用以下代码以巴西使用的格式进行格式化:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"

2
你也可以尝试这个,在JasperReports中强制正确的格式:parameters.put("REPORT_LOCALE", new Locale("pt", "BR"));将此参数发送到报告。 - deldev

7
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);

6
如上所述,以下 链接 提供了特定的国家代码,以允许Java本地化数字。每个国家都有自己的风格。
在上面的链接中,您将找到应放置在此处的国家代码:
...(new Locale(<COUNTRY CODE HERE>));

例如,瑞士的数字格式如下:

1000.00 --> 1'000.00

国家代码

为了实现这一点,以下代码对我很有用:

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

结果与预期相符:

1'000.00

5
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20




2
虽然这段代码可能提供了问题的解决方案,但最好添加上为什么/如何运作的上下文。这可以帮助未来的用户学习,并将这些知识应用到他们自己的代码中。当代码被解释时,您还可能会得到用户的积极反馈,例如点赞。 - borchvm

4

对于小数

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));

4
接受的答案必须进行大量修改才能正常工作。 getDecimalFormatSymbols 会创建一个防御性副本。因此,
DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

这是新的一行代码:formatter.setDecimalFormatSymbols(symbols);


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