在 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中格式化带有小数位的数字符号而不进行除法的正确方法