Trim 从小数点后的字符串到 java 中的 18 位 - 不需要四舍五入)

Trim from String after decimal places to 18 places in java - roundoff not required)

我正在处理遗留代码,其中我有一个 String 字段,它包含一些金额值,小数点后应该只有 18 个字符,不能超过那个。

我已经实现了如下 -

        String str = "0.0040000000000000001";
    String[] values = StringUtils.split(str,".");
    System.out.println(str);
    String output = values[1];
    if(output.length()>18){
        output = output.substring(0,18);
    }
    System.out.println(values[0]+"."+output); // 0.004000000000000000

有更好的方法吗?

使用正则表达式作为单行解决方案:

str = str.replaceAll("(?<=\..{18}).*", "");

live demo

您可以在此处使用正则表达式替换:

String str = "0.0040000000000000001";
String output = str.replaceAll("(\d+\.\d{18})(\d+)", "");
System.out.println(output); // 0.004000000000000000

放在一个方法中,测试几种方案,看哪个更好。您必须首先定义“更好”对您的特定 use-case 意味着什么:更少的内存?更快?

我提议:

public static String trimDecimalPlaces(String input, int places) {
    int dotPosition = input.indexOf(".");
    int targetSize = dotPosition + places + 1;
    if (dotPosition == -1 || targetSize > input.length()) {
        return input;
    } else {
        return input.substring(0, targetSize);
    }
}

这比 regex-based 解决方案有速度优势,但在代码方面肯定更长。