String.format 特定于语言环境的双格式选项,例如 Double.toString()?
String.format option for locale specific double formatting like Double.toString()?
我想使用 String.format()
在 Java 中格式化我的 double
,以便我可以使用 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
String formatWithLocale(Double value, Locale locale) {
return DecimalFormat.getInstance(Locale.FRENCH).format(value);
}
这里不多说,DecimalFormat正是你想要的。
如果您真的想坚持使用 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 已经建议了。
我想使用 String.format()
在 Java 中格式化我的 double
,以便我可以使用 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
String formatWithLocale(Double value, Locale locale) {
return DecimalFormat.getInstance(Locale.FRENCH).format(value);
}
这里不多说,DecimalFormat正是你想要的。
如果您真的想坚持使用 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 已经建议了。