如何将一个字符串数字格式化为带有逗号和四舍五入的形式?

185

如何最好地将给定的字符串格式化为数字?

String number = "1000500000.574" //assume my value will always be a String

我希望将其作为一个字符串,值为:1,000,500,000.57

如何格式化它呢?

11个回答

297
你可能需要查看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
你可以使用以下的解决方案 -public static String getRoundOffValue(double value){ DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00"); return df.format(value); } - Jitendra Nath
1
我也更喜欢在小数点前加上零,就像DecimalFormat formatter = new DecimalFormat("#,##0.00");这样对于零得到.00听起来不太合适。 - Leo
请注意,直接实例化DecimalFormat违反了Javadoc的规定:“通常不要直接调用DecimalFormat构造函数,因为NumberFormat工厂方法可能返回除DecimalFormat之外的子类。” 对我来说似乎是糟糕的设计,但它就是这样。 - jhyot
除了逗号,是否可以对其他字符进行操作,比如句点? - Mandroid

69

如果您需要在一个字符串中格式化多个数字,使用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


60

考虑到这是搜索引擎谷歌上“Java格式化数字加逗号”的排名第一结果,以下答案适用于整数且不关心小数点的用户。

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

输出:

2,000,000

1
也适用于浮点数,例如,printf("%,f\n",decimalNumber)。 - philwalk

50

一旦您将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位小数? - Jonik
6
啊,没关系,找到了:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale)) - Jonik

13
我已经创建了自己的格式化工具,它在处理格式化时非常快,并提供了许多功能 :)
它支持:
- 逗号格式化,例如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”。也许我可以添加小数支持,但是我认为没有太多用处,因为那样的话,我可能会将其合并到一个处理压缩char[]数组进行数学计算的BigInteger类型的类中。


2
如果你只在英语环境下工作,这很不错。但我的建议是尽量避免这样的做法,因为它会让不懂英语的用户感到困扰,他们无法理解K或者M是什么意思。 - rishabhmhjn
@rishabhmhjn 但是...你不能只是调整它来修改任何你需要的字母吗?难道他的不幸是他的错吗?:o 而且他所创造的东西非常酷,尽管链接现在似乎无法访问。 - Aquarius Power
@AquariusPower 问题是,例如,日本的数字不遵循公制系统。他们的数字像1百代表100,1千代表1000,1万代表10000,然后变成1千万代表1000,0000。我的团队正在使用Javascript开发类似的东西。您可以使用此链接中提到的逻辑:https://github.com/statusbrew/angular-bignumber - rishabhmhjn
找到了我以前写的代码,所以我重新上传到了GitHub。评论中的链接已经更新。 - Jeremy Trifilo

7
您也可以使用以下解决方案。
public static String getRoundOffValue(double value){
    DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
    return df.format(value);
}

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

4
您可以使用以下代码在一行中完成整个转换过程:
String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

DecimalFormat构造函数中的最后两个#符号也可以是0。无论哪种方式都可以。

4
以下是最简单的到达方法:
String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

output: 10,987,655.88


3

第一个答案非常好,但是对于 ZERO / 0 它会格式化为 .00

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


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