打印/格式化区域设置感知浮动,其中“只有尽可能多的区分”数字在Java中

时间:2012-06-07 16:54:05

标签: java formatting floating-point

默认的Java Float.toString(float)方法打印一个浮点数,其中“只需要尽可能多的...... [小数]”数字,以便唯一地将参数值与类型float的相邻值区分开来。“完善!正是我需要的 - 除了我需要以特定于语言环境的方式执行此操作(例如,在法语计算机上“1.23”将表示为“1,23”)。

如何以区域设置感知的方式重现Float.toString(float)的功能?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

String s1 = String.format(Locale.FRANCE, "%.2f", 1.23f); // Country FRANCE 1,23
String s2 = String.format(Locale.FRENCH, "%.2f", 1.23f); // Language FRENCH 1,23
String s3 = String.format("%.2f", 1.23f); // Default Locale

.2是可选的,是小数位数

如果Locale.getDefault()为法国返回适当的Locale,则可以与第三个一起使用。

另一种方法是使用NumberFormat

NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
String s4 = nf.format(1.23f); // 1,23

答案 1 :(得分:0)

我认为问题的重要部分是Float.toString()会自动计算出相关的小数位数,并且可以很好地完成它。在我的JRE中,使用了类sun.misc.FloatingDecimal类。该类中的逻辑看起来非常复杂,难以重现。

可用于猜测要显示的正确位数的另一个类是BigDecimal。例如,如果您使用的是double而不是float

double d = 1.23;
NumberFormat nf = NumberFormat.getNumberInstance(Locale.FRENCH); 
BigDecimal bd = BigDecimal.valueOf(d);
nf.setMaximumFractionDigits(bd.scale());
String s = nf.format(1.23f); // 1,23 

对于浮点数,首先必须弄清楚如何在不改变精度的情况下从float转换为BigDecimal:How to convert from float to bigDecimal in java?