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}).*", "");
您可以在此处使用正则表达式替换:
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 解决方案有速度优势,但在代码方面肯定更长。
我正在处理遗留代码,其中我有一个 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}).*", "");
您可以在此处使用正则表达式替换:
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 解决方案有速度优势,但在代码方面肯定更长。