在java中使用Regex来查找字符串是否为尾部为零的十进制数字格式



我正在阅读一份字符串列表,其中一些字符串是小数形式的,并将它们与另一个字符串进行比较。遗憾的是,在第一个列表中,我发现所有的十进制项,也就是所有的字符串都有一个额外的尾随零。因此,我的.equals()函数或.contains()函数不起作用。

List 1 : 134.20, 16, abacus, 44.10, 12/2/2013, 4, 45.220
List 2 : 134.2,  16, abacus, 44.2,  12/2/2013, 4, 45.22

如何在列表2中添加尾随零?有没有办法使用regex左右来以某种方式删除尾部的零(如果存在)?

相反,我可以删除列表1中的尾随零吗?

要从小数中删除尾随零:

String zeroless = str.replaceAll("(\b\d+\.[1-9]*)0+\b", "$1");

在没有零的地方添加尾随零:

String zeroless = str.replaceAll("(\b\d+\.\d*)[1-9]\b", "$10");

这个正则表达式的一个重要部分是用\b包装——一个"单词边界"。


我不确定这两种方法有多有用。如果你想看看一个特定的小数是否在字符串中,请从中删除尾随零,然后在输入中用可选尾随零搜索它,如下所示:

String num;  // eg 123.456
if (input.matches(".*\b" + num.replace(".", "\.").replaceAll("0+$", "") + "0*\b.*")) {
    // input contains the number
}

这将读取所有不必要的尾随零:

str = str.replaceAll("(\d+\.\d+?)0+", "$1");

示例:

123.456000 --> 123.456
123.000    --> 123.0

更新:在评论中,你问如何无条件地附加零。这就是你的做法:

str = str.replaceAll("(\d+\.\d+)", "$10");

您应该使用BigDecimal来比较十进制值,而不是字符串。去掉正则表达式,使用新的BigDecimal(String),设置所需的小数位数,然后使用compareTo().

您可以使用String.format()将它们全部取到小数位数。

String yourValue = "4.4";
int range = 3;
String zeros = String.format("%."+range+"f", Float.parseFloat(yourValue)); // 3 decimal places
System.out.println(zeros); // prints 4.400

根据需要更改小数位数的范围。

或者,如果您只是使用它们来检查它们是否相等/更大/更小,那么为什么不将字符串解析为Double(或其他合适的对象),然后将Double与"2.2" == "2.20"进行比较,并且您可以为这些对象使用已经定义的equals()compareTo()

相关内容

  • 没有找到相关文章

最新更新