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

打印/格式化区域设置感知浮动,在Java中使用“只有尽可能多的数字来区分”,java,formatting,floating-point,Java,Formatting,Floating Point,默认方法打印的浮点数只有。。。所需的[小数]位数,用于唯一区分参数值与float类型的相邻值。完美的这正是我所需要的--除了我需要以特定于语言环境的方式进行操作,例如在法国计算机上,1.23将表示为1,23 如何以区域设置感知的方式重现Float.toStringfloat的功能?您可以尝试以下操作: String s1 = String.format(Locale.FRANCE, "%.2f", 1.23f); // Country FRANCE 1,23 String s2 = String

默认方法打印的浮点数只有。。。所需的[小数]位数,用于唯一区分参数值与float类型的相邻值。完美的这正是我所需要的--除了我需要以特定于语言环境的方式进行操作,例如在法国计算机上,1.23将表示为1,23


如何以区域设置感知的方式重现Float.toStringfloat的功能?

您可以尝试以下操作:

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是可选的,是小数位数

可以使用第三个if Locale.getDefault返回适合法国的语言环境

另一种方法是使用NumberFormat


我认为问题的重要部分是Float.toString自动计算出相关的小数位数,并且做得相当好。在我的JRE中,使用了sun.misc.FloatingDecimal类。这个类中的逻辑看起来相当复杂,很难重现

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

对于浮点,您首先必须了解如何在不更改精度的情况下从浮点转换为BigDecimal:

NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);
String s4 = nf.format(1.23f); // 1,23
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