如何使用NumberFormat
格式化给定double
的{{1}}值(默认语言环境已足够)和给定的小数位数?
例如,我有这些值:
Locale
我想以下列方式打印它们,例如使用美国语言环境和2位小数:
double d1 = 123456.78;
double d2 = 567890;
在这种情况下,我实际上并不关心舍入模式,因为这些双值是从具有给定比例的123,456.78
567,890.00
获得的,因此它们的小数位数总是小于或等于小数位数我想打印的地方。
修改
为了使事情变得更清楚,问题在于我想以依赖于语言环境的方式显示钱,但是具有固定数量的小数位。上面的示例显示了如果系统区域设置为BigDecimal
,应如何格式化值。现在假设,系统区域设置为en_US
(捷克语),因此应以这种方式格式化相同的数字:
cs_CZ
现在,如何设置NumberFormat以始终显示2个小数位,但是根据当前区域设置显示千位分隔符和小数点?
答案 0 :(得分:41)
如果您想阅读NumberFormat的文档,解决方案将是显而易见的:
double d1 = 123456.78;
double d2 = 567890;
// self commenting issue, the code is easier to understand
Locale fmtLocale = Locale.getDefault(Category.FORMAT);
NumberFormat formatter = NumberFormat.getInstance(fmtLocale);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
System.out.println(formatter.format(d1));
System.out.println(formatter.format(d2));
System.out.println(fmtLocale.toLanguageTag());
在我的机器上打印出来:
123 456,78
567个890,00
PL-PL
我相信这正是您所寻找的,而且您不必弄乱模式。我不这样做 - 例如,有一些区域设置将数字分组,而不是三组(这就是我们讨论分组分隔符和不 的原因)千位分隔符)。
答案 1 :(得分:8)
public void localizedFormat(double value,Locale loc ) {
NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern("###,###.00");
String output = df.format(value);
}
此功能应该为您提供所需的格式。
答案 2 :(得分:1)
您可以使用类似
的内容DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance();
formatter.applyPattern("#,###,##0.00");
formatter.format(yourDoubleHere)
答案 3 :(得分:-1)
将double值转换为double值,后面带有十进制后的任意位数。 我在Utility类中创建了这个方法,以便在整个项目中访问它。
public static double convertToDecimal(double doubleValue, int numOfDecimals) {
BigDecimal bd = new BigDecimal(doubleValue);
bd = bd.setScale(numOfDecimals, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();
}