在 Java 中打印/格式化具有“仅能区分”数字的区域感知浮点数

Posted

技术标签:

【中文标题】在 Java 中打印/格式化具有“仅能区分”数字的区域感知浮点数【英文标题】:Print / format locale-aware floats with "only as many to distinguish" digits in Java 【发布时间】:2012-06-11 18:34:10 【问题描述】:

默认的Java Float.toString(float) 方法会打印一个浮点数,其中“仅需要将参数值与float 类型的相邻值唯一区分所需的... [小数] 位数”。完美的!正是我需要的——除了我需要以特定于语言环境的方式执行此操作(例如,在法国计算机上,“1.23”将表示为“1,23”)。

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

【问题讨论】:

【参考方案1】:

您可以尝试以下方法:

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

【讨论】:

【参考方案2】:

我认为问题的重要部分是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 

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

【讨论】:

以上是关于在 Java 中打印/格式化具有“仅能区分”数字的区域感知浮点数的主要内容,如果未能解决你的问题,请参考以下文章

PHPExcel:长数字在阅读时具有科学格式(xxxE-08)

打印的字符串中出现意外的数字格式

在Java中格式化带有小数位的数字符号而不进行除法的正确方法

如何在 Delphi 中将浮点数转换为字符串,指定有效数字,而不是十进制数字(而不是 G 格式)

在 PHP 中打印货币数字格式

java - 如何获得将二维数组打印到java中的两个文件的功能?