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


129

如何在Java中设置千位分隔符?
我有BigDecimal的String表示形式,我想使用千位分隔符进行格式化并以String形式返回。


您是从DB获得这些值吗?
Dead Programmer

Answers:


110

这应该可以工作(未经测试,基于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
对此未经测试的评论:Javadoc for getDecimalFormatSymbols()说:Returns: a copy of the desired DecimalFormatSymbols。因此,您应setDecimalFormatSymbols(theCopy)在更改副本后使用。
java.is.for.desktop,2011年

6
bd.longValue()的文档说“任何小数部分都将被丢弃”。所以我不知道这是否是做到这一点的最好办法,如果你在乎精度
codinguser

2
我想您可以使用new并将其设置回格式化程序: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

我认为您可能希望使用\ u00a0(不间断空格)作为分组分隔符。这是某些语言环境的默认设置。
ACV

3
为什么叫longValue?问题是要为BigDecimal设置成千上万的运算符,但时间不长。
FINDarkside '17

232

您可以将格式功能与“,”一起使用;

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

“,”包括特定于语言环境的分组字符。

docs


11
如果我想使用a .作为分隔符怎么办?
Enissay 2015年

正如我通常使用String.format一样,这对我来说是最好的,也是最简单的!
阿里

16
@Enissay format()使用显式语言环境(Local.US已知,用作分隔符)进行调用,然后替换,为您的自定义分隔符:String.format(Locale.US, "%,d", n).replace(',', '.')
minipif 2015年

java.util.IllegalFormatConversionException:%d无法格式化java.lang.String参数
Iman Marashi

1
@ImanMarashi将其转换为int。还是一个long。还是一个BigInteger。而使用f如果你想使用doublefloatBigDecimal
Adowrath

56
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使用所需的属性来构建对象,然后使用该对象格式化您的BigDecimal。一个BigDecimal仅具有指定的值,没有指定的格式。
Joachim Sauer

1
请注意,千位分隔符通常是一个不间断的空间(当它是一个空间时)
cquezel

必须将第二个选项的第一行更改为DecimalFormatSymbols symbol = new DecimalFormatSymbols(); 为此工作。
PaperThick 2013年

14

尝试将此代码格式化为巴西使用的格式:

    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")); 将此参数发送到报表。
dellasavia

8

如果将千位分隔符用于整数数据类型,请使用1。

  1. 对于整数数据类型

String.format(“%,d \ n”,58625),输出将为58,625

  1. 对于浮点数据,键入String.format(“%,. 2f”,58625.21),输出为58,625.21

这是一个顿悟。但是,您实际上必须强调,“,”仅是一个标志,而不是它用作组分隔符的字符。(花了一些时间找到问题。)请参阅docs.oracle.com/javase/7/docs/api/java/util/Formatter.html
Vankog,

5
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);

4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);

3

接受的答案必须进行真正的更改,否则将无法正常工作。该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);


2

对于小数

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));

1

如上所述,下面的链接为您提供了特定的国家/地区代码,以允许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

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

formatStr(2524.2) // 2,254.20



尽管此代码可以为问题提供解决方案,但最好添加有关其原因/工作方式的上下文。这可以帮助将来的用户学习并将该知识应用于他们自己的代码。在解释代码时,您还可能以投票的形式从用户那里获得积极的反馈。
borchvm 7:47
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.