将float格式化为最大N位小数

时间:2016-05-13 00:38:36

标签: java floating-point numbers format

我想将数字格式化为最多N位小数。有another similar and popular question here,但这并不是我正在寻找的。

我正在寻找这样的东西,让我说我想要最大化。 2个地方,所以这将是:

1.00  -> "1"    (not "1.00")
1.20  -> "1.2"  (not "1.20")
1.23  -> "1.23"
1.234 -> "1.23"
1.235 -> "1.24"

与另一个问题的不同之处在于,如果我不需要它,我不希望在逗号后面使用尾随零。

我想知道这是否适用于 String.format() ,而不是Math.round()或DecimalFormat。上面显示的另一个问题提供了DecimalFormat的解决方案。

在N作为参数的情况下,答案不需要变量。我只选择N作为例子。

4 个答案:

答案 0 :(得分:3)

您可以使用 DecimalFormat

引用文档:

  

您可以使用DecimalFormat类将十进制数格式化为特定于语言环境的字符串。此类允许您控制前导和尾随零,前缀和后缀,分组(千)分隔符和小数分隔符的显示。

     

井号(#)表示一个数字,句点是小数点的占位符   分离器。

public void test(){
    DecimalFormat df = new DecimalFormat("#.##");
    System.out.println(df.format(1.00));
    System.out.println(df.format(1.20));
    System.out.println(df.format(1.23));
    System.out.println(df.format(1.234));
    System.out.println(df.format(1.235));
}

输出:

1
1.2
1.23
1.23
1.24

更新:由于您更新了问题,并且您想使用String.format,因此在SO中搜索找到此thread并利用技巧加正则表达式。所以,你可以使用这样的东西:

public static void main (String[] args) throws java.lang.Exception
{
    System.out.println(fmt(1.00));
    System.out.println(fmt(1.20));
    System.out.println(fmt(1.23));
    System.out.println(fmt(1.234));
    System.out.println(fmt(1.235));
}

public static String fmt(double d)
{
    if(d == (long) d)
        return String.format("%d",(long)d);
    else
        return String.format("%.2f",d).replaceAll("0*$", "");
}

输出结果为:

1
1.2
1.23
1.23
1.24

无论如何,我会改用 DecimalFormat

答案 1 :(得分:2)

您还可以使用DecimalFormat控制setMaximumFractionDigits(...)的格式,如下所示:

double d = 1.234567;
DecimalFormat df = new DecimalFormat();
for (int i = 2; i < 6; ++i) {
  df.setMaximumFractionDigits(i);
  System.out.println(df.format(d));
}

对于您的用例,这可能比使用StringBuilder或类似的格式生成格式更好。

答案 2 :(得分:0)

另一种解决方案,如果你仍想用String.format()做,这是解决方案:

Java代码:ParseN.java

public class ParseN{

     public static void main(String []args){
        System.out.println(parseN(1.00));
        System.out.println(parseN(1.20));
        System.out.println(parseN(1.23));
        System.out.println(parseN(1.234));
        System.out.println(parseN(1.235));
     }

     static String parseN(Double d)
     {
       String s = String.format("%.2f", d);
       s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");
       return s;
     }
}

输出:

1
1.2
1.23
1.23
1.24

希望它完全回答你的问题。另请参阅this

答案 3 :(得分:0)

使用NumberFormat。

NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(2); // or N

System.out.println(format.format(1)); // -> 1
System.out.println(format.format(1.2)); // -> 1.2
System.out.println(format.format(1.23)); // -> 1.23
System.out.println(format.format(1.234)); // -> 1.23
System.out.println(format.format(1.235)); // -> 1.24

NumberFormat也可以与语言环境一起使用,您可以更改舍入模式。

NumberFormat format = NumberFormat.getInstance(Locale.GERMANY);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.CEILING);

System.out.println(format.format(1)); // -> 1
System.out.println(format.format(1.2)); // -> 1,2
System.out.println(format.format(1.23)); // -> 1,23
System.out.println(format.format(1.234)); // -> 1,24
System.out.println(format.format(1.235)); // -> 1,24