String.format选项用于特定于语言环境的双重格式,如Double.toString()?

时间:2015-01-20 10:14:30

标签: java localization formatting double

我想使用double在Java中格式化String.format(),以便我可以使用Locale进行格式化。但是,我找不到合适的组合来模仿java的Double.toString()。

我希望小数位数与Double.toString()相同,但其余的(分组和小数分隔)是本地化的。我想使用String.format / Formatter选项。

这就是我想要实现的目标:

double: 12_345.678_90 --> 12 345.6789
double: 12_345.6      --> 12 345.6

这是我到目前为止所做的:

Locale fr = Locale.FRENCH;
System.out.println(new Double( 12_345.678_90 ).toString() );
System.out.println(new Double( 12_345.6 ).toString() );

System.out.println(String.format(fr, "%,f", new Double( 12_345.678_90 ) ) );
System.out.println(String.format(fr, "%,f", new Double( 12_345.6 ) ) );

System.out.println(String.format(fr, "%,g", new Double( 12_345.678_90 ) ) );
System.out.println(String.format(fr, "%,g", new Double( 12_345.6 ) ) );

输出

12345.6789
12345.6
12 345,678900
12 345,600000
12 345,7
12 345,6

2 个答案:

答案 0 :(得分:1)

String formatWithLocale(Double value, Locale locale) {
    return DecimalFormat.getInstance(Locale.FRENCH).format(value);
}

这里说的不多,DecimalFormat正是你想要的。

答案 1 :(得分:1)

如果你真的想坚持使用String.format,那么就没有直接的方式来实现你想要的东西。如果您知道数字位数,那么您可以制作格式字符串。

以下是一些更理论化的解决方案。两者都不建议使用和发布只是为了编码的乐趣。 ; - )

double d1 = 12_345.678_90;
double d2 = 12_345.6;

// toString()
System.out.println("Double.toString: " + Double.toString(d1));
System.out.println("Double.toString: " + Double.toString(d2));

// one (not recommended) solution
// using proprietary sun.misc.FloatingDecimal and reflection
Field value = FloatingDecimal.class.getDeclaredField("nDigits");
value.setAccessible(true);

int numberOfDigits = (int) value.get(new FloatingDecimal(d1));
String format = "String.format  : %,." + numberOfDigits + "g";
System.out.println(String.format(FRENCH, format, d1));

numberOfDigits = (int) value.get(new FloatingDecimal(d2));
format = "String.format  : %,." + numberOfDigits + "g";
System.out.println(String.format(FRENCH, format, d2));

// another (not recommended) solution
numberOfDigits = Double.toString(d1).replaceAll("\\.", "").length();
format = "String.format  : %,." + numberOfDigits + "g";
System.out.println(String.format(FRENCH, format, d1));

在您的情况下,我个人更愿意使用DecimalFormat,因为@Attila已经建议。