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

标签 java localization formatting double

我想使用 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.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 已经建议了它。

关于java - 用于特定于语言环境的双格式的 String.format 选项,例如 Double.toString()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28042733/

相关文章:

JavaFX 桌面应用程序 - 使用 HSQLDB(嵌入式)和 Hibernate

java - HIbernate saveorUpdate() 更新时插入新记录

c# - 使用语言代码 (en) 还是完整的文化代码(例如 en-AU)?

date - 如何在日期公式中将月份的第一个字母大写?

迄今为止的 bash 字符串

java - ORB.destroy() 无法正确清理,ORB 对象实例不会被垃圾回收

java - 给出所需输出的消息格式

android - 在 Android 中以编程方式更改应用程序语言

java - 如何在 Java 或 Groovy 中为多种语言获取数字的序数后缀

.net - WPF RichTextBox - 键入文本的格式