从小数点后的字符串修剪到四舍五入中的18位(不需要)



我正在编写一个遗留代码,其中有一个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}).*", "");

观看现场演示。

把它放在一个方法中,测试几个替代方案,看看哪个更好。您必须首先定义什么是";"更好";对于您的特定用例,意味着:更少的内存?更快?

我建议:

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);
}
}

与基于正则表达式的解决方案相比,这具有速度优势,但就代码而言,它肯定更长。

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

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

最新更新