如何格式化字符串数字以使其带有逗号和舍入?


Answers:


256

您可能要看一下DecimalFormat课程。它支持不同的语言环境(例如:在某些国家/地区,其格式会1.000.500.000,57改为)。

您还需要将该字符串转换为数字,可以使用以下方法完成:

double amount = Double.parseDouble(number);

代码示例:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));

您能否显示一个示例,说明如何在这种情况下使用NumberFormat?
Sheehan Alam

1
您还可以使用以下解决方案-公共静态字符串getRoundOffValue(双值){DecimalFormat df = new DecimalFormat(“ ##,##,##,##,##,##,## 0.00”); 返回df.format(value); }
Jitendra Nath 2014年

我也喜欢在DecimalFormat formatter = new DecimalFormat(“#,## 0.00”);之类的点之前添加零。-为零获取.00听起来对我来说是错的
狮子座

46

这也可以使用String.format()完成,如果您要在一个字符串中格式化多个数字,则可能会更容易和/或更灵活。

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

对于格式字符串“%,. 2f”-“,”表示带逗号的单独数字组,而“ .2”表示在小数点后舍入到两位。

有关其他格式设置选项的参考,请参见https://docs.oracle.com/javase/tutorial/java/data/numberformat.html


42

将String转换为数字后,即可使用

// format the number for the default locale
NumberFormat.getInstance().format(num)

要么

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)

如何同时指定语言环境舍入(例如)2个小数位?
尼克

6
啊,没关系,找到了它:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
Jonik

16

鉴于这是Google的结果之一format number commas java,这是一个答案,适用于使用整数而不关心小数的人。

String.format("%,d", 2000000)

输出:

2,000,000

也适用于浮点数,例如printf(“%,f \ n”,decimalNumber)
philwalk

12

我创建了自己的格式化实用程序。它在处理格式方面非常快,并为您提供了许多功能:)

它支持:

  • 逗号格式化例如1234567变为1,234,567。
  • 以“千(K),百万(M),十亿(B),万亿(T)”为前缀。
  • 精度为0到15。
  • 精度调整大小(如果您希望6位精度,但只有3个可用数字,则将其强制为3)。
  • 降低前缀(意味着如果您选择的前缀太大,则会将其降低为更合适的前缀)。

该代码可以在这里找到。您这样称呼它:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

我还应该指出,这不能处理十进制支持,但对于整数值非常有用。上面的示例将显示“ 1.23M”作为输出。我也许可以添加十进制支持,但是没有看到太多的用途,因为那之后我最好将其合并为BigInteger类型的类,该类处理用于数学计算的压缩char []数组。


2
如果您仅使用英语,这很好。我的建议是避免这样的事情,因为它会激怒我的非英语用户的晚餐,因为他们不明白他们的意思KM意思
rishabhmhjn 2015年

@rishabhmhjn但是...您能否只是对其进行调整以将其修改为所需的任何字母?你的倒霉是他的错吗?:O和他创造的是相当冷静,尽管链接似乎不可用现在..
水瓶座电力

@AquariusPower问题是例如日语数字不遵循公制。他们的数字是1/100 = 100,1000 = 1000,1万= 10000,然后1000000 = 1,000,000。我的团队正在研究类似的Javascript。您可以使用此代码中提到的逻辑:github.com/statusbrew/angular-bignumber
rishabhmhjn

找到了我的旧代码,因此将其重新上传到GitHub。评论链接已更新。
杰里米·特里菲洛19'Jan

6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}

6

您也可以使用以下解决方案-

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}

4

您可以使用以下代码在一行中完成整个转换:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

DecimalFormat构造函数中的最后两个#符号也可以为0。不管哪种方法。


3

第一个答案效果很好,但对于零/ 0,它将格式化为.00

因此,格式#,## 0.00对我来说效果很好。在部署到生产系统之前,请始终测试不同的数字,例如0/100 / 2334.30和负数。


3

这是到达那里的最简单方法:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

输出:10,987,655.88

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.