与this question有些相关以及与格式化小数相关的其他几个SO问题(在这种情况下,所有这些都没有帮助我)。
我正在尝试将Long格式化为字符串,例如123456 - > 012.345,6(句号后跟逗号看起来很奇怪,这是项目要求)。
我正在尝试使用DecimalFormat进行格式化:
private static final DecimalFormat format = new DecimalFormat(“## 0.000,0”);
然而,它在实例化期间抛出异常:
java.lang.IllegalArgumentException:格式错误的模式“## 0.000,0”
我还尝试过预先将区域设置更改为EU系统,例如
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.GERMAN);
如何以这种方式格式化数字? DecimalFormat是错误的解决方案吗?我可以使用NumberFormat吗?或者我需要自定义格式化程序吗?
答案 0 :(得分:7)
您应该避免直接构建DecimalFormat
。逗号始终用于在模式定义中进行分组,而不管它们在目标语言环境中的显示方式。同样,句点总是用于小数。这似乎不合逻辑,但必须记住这是一个模式定义,和#一样,这些字符描述的是替换,而不是字符本身。
NumberFormat f = NumberFormat.getInstance(Locale.GERMANY);
if (f instanceof DecimalFormat) {
((DecimalFormat) f).applyPattern("##0,000.0");
}
f.format(123456 / 10.0);
需要除以10来获得小数点后的数字。
答案 1 :(得分:1)
http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html
让我们试试这个
new DecimalFormat(“0 ##,###。0”);
记住,逗号是分隔符,分数是分数。你无法切换那两个。此格式将打印前导零,两个重要数字,然后是三位数,然后是小数,如果是圆数,则打印0。我想。
所以,你能得到的最好的是 123456-> 012,345.6
解决方法:
int index1 = string.indexOf(',');
int index2 = string.indexOf('.');
string.setCharAt(index1, '.');
string.setCharAt(index2, ',');
答案 2 :(得分:1)
很抱歉,如果我错过了您的请求,但如果您需要非标准号码表示,那么您可以写一个格式化器就足够了:
static String formatLong(long value) {
String ret = Long.toString(value);
// Make the value 7 digits by prepending 0's
while(ret.length()<7) ret="0"+ret;
// Add a comma before the last digit
ret = ret.substring(0,ret.length()-1)+","+ret.substring(ret.length()-1);
// Add a period before the 4th digit
ret = ret.substring(0,ret.length()-5)+"."+ret.substring(ret.length()-5);
return ret;
}
long a = 123456;
System.out.println(formatLong(a));
打印“012.345,6”
答案 3 :(得分:0)
您可以使用DecimalFormatSymbols
类将分组和小数分隔符设置为您想要的任何字符。
Java教程中显示了一个示例(在“更改格式符号”部分中):http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html
在模式中,分组总是用,
表示,小数点用.
表示。
答案 4 :(得分:0)
根据我对javadoc的解读,DecimalFormat仅支持数字的整数部分中的“分组”;即之前小数位。
格式字符串的语法暗示了这一点,','
之前只允许'.'
。
setGroupingSize(int)
的javadoc暗示了
“分组大小是分组分隔符在数字的整数部分”之间的位数。