如何从字符串值中去除尾随零并删除小数点

14

如何删除字符串值中的尾随零,并在小数点后面只包含零的情况下删除小数点?我正在使用以下代码:

String string1 = Double.valueOf(a).toString()

这将删除(10.10和10.2270)末尾的零,但我在第一和第二个输入中没有得到期望的结果。

输入

10.0
10.00
10.10
10.2270

期望输出

10
10
10.1
10.227

请尝试使用 BigDecimal。 - Scary Wombat
最佳选择是使用正则表达式来满足这种需求。 - vikeng21
@ScaryWombat 提出的重复问题中输入是 double 类型,而这个问题的输入是 String 类型。 - jdphenix
1
@jdphenix 那么为什么OP要这样做 String string1 = Double.valueOf(a).toString() - Scary Wombat
1
@ScaryWombat 因为我没有仔细阅读问题。糟糕。 - jdphenix
@jdphenix 非常酷,顺便点赞你的回答。 - Scary Wombat
3个回答

17

Java库中有一个内置类可以完成此操作。它就是BigDecimal

以下是一个示例用法:

BigDecimal number = new BigDecimal("10.2270");  
System.out.println(number.stripTrailingZeros().toPlainString());

输出:

10.227

注意:使用接受 String 参数的 BigDecimal 构造函数非常重要。您可能不想使用接受 double 的构造函数。


这是一个方法,它将接受一个 Collection<String> 并返回另一个去除尾随零的 Collection<String>,包装好送给你。

public static Collection<String> stripZeros(Collection<String> numbers) {
    if (numbers == null) { 
        throw new NullPointerException("numbers is null");
    }

    ArrayList<String> value = new ArrayList<>(); 

    for (String number : numbers) { 
        value.add(new BigDecimal(number).stripTrailingZeros().toPlainString());
    }

    return Collections.unmodifiableList(value);
}

示例用法:

ArrayList<String> input = new ArrayList<String>() {{ 
    add("10.0"); add("10.00"); add("10.10"); add("10.2270"); 
}};

Collection<String> output = stripZeros(input);
System.out.println(output);

输出:

[10, 10, 10.1, 10.227]

2
وˆ‘هڈ‘çژ°ن½؟用stripTrailingZeros()ه’ŒtoPlainString()çڑ„组هگˆن¼ڑه¯¼è‡´è¾“ه‡؛结و‍œè¶…ه‡؛و‚¨çڑ„规范م€‚وˆ‘ه·²ç»ڈè؟›è،Œن؛†و›´و­£م€‚ - jdphenix
我没有问那个问题 lol - Kick Buttowski
虽然从技术上讲是正确的,但对我来说并没有用处,比如:1.23 变成了 1.229999999999999982236431605997495353221893310546875。所以确实不能有尾随零。 - ycomp

-1

尝试

DecimalFormat decimalFormat = new DecimalFormat("#.##");
String string1 = decimalFormat.format(10.000);

3
这将删除第二个尾数位以后的所有内容。 - jdphenix

-4
尝试像这样使用正则表达式:

public static void main(String[] args) {
    String s = "10.0";
    System.out.println(s.replaceAll("[0]+$", "").replaceAll("(\\.)(?!.*?[1-9]+)", ""));

}

O/P:
10

input :String s = "10.0750";
O/P : 10.075

input : String s = "10.2750";
O/P : 10.275

2
我不介意被踩。但是我想知道为什么? - TheLostMind
不是 DV,但正如其他人所说,“可能在每个区域设置中都无法工作。有些使用小数点作为分组分隔符。” - Scary Wombat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接