【问题标题】:Java DecimalFormat to omit leading zero before decimal pointJava DecimalFormat 省略小数点前的前导零
【发布时间】:2015-07-22 10:48:24
【问题描述】:

让我们看看下面的代码sn-p

double f = .123;        
System.out.println(f);
System.out.println(new DecimalFormat(".###").format(f));

所以我们可以使用.### 省略前导零 0,尽管我们必须在小数点/句点之后定义尾随数字。

我想定义可以提供无限after-decimal-point数字的DecimalFormat格式化程序。

我该怎么做?

附言

我确实尝试过".",但我们没有打印任何十进制数字。我们可以有一些像".#*" 这样的格式语法吗?

【问题讨论】:

    标签: java format decimal


    【解决方案1】:

    Double 是一个有限近似值(64 位,包括符号和指数),因此无法做到无限和精确。

    使用 BigDecimal。 String 构造函数将通过字符串获取其精度。

    BigDecimal n = new BigDecimal("0.1234567890123456789012345678901234567890");
    n = n.multiply(n); // n now has double precision.
    String s = n.toPlainString().replaceFirst("^0\\.", "."); // Without exponent.
    

    如果您想要无限代表,只需使用toPlainString。 关于在句点之前删除零可以用正则表达式替换有点难看。

    【讨论】:

      【解决方案2】:

      由于float 没有无限数量的after-dicimal-points,因此请尽可能多地使用#

      您还可以将数字转换为字符串并选择要显示的子字符串。

      float f = 0.123;
      String fs = Float.toString(f);
      System.out.println(fs.substring(fs.indexOf('.'), fs.lenght());
      

      如果您事先不知道,如果您的编号只有一个前导零,这也有效。

      很遗憾,我无法告诉您 DecimalFormatter 是否也可以这样做。

      【讨论】:

        【解决方案3】:

        您可以将数字转为字符串并跳过第一个字符:

        double f = .123;        
        System.out.println(Double.toString(f).substring(1));
        

        经过一番研究,我不相信这可以通过使用DecimalFormat 来实现。但是,您建议的 ".#*" 可能是一个有用的补充。

        【讨论】:

        • 感谢您对 .#* 的支持 - 一种原生的格式化方式是未知的,这就是我问的原因
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-01
        相关资源
        最近更新 更多