我有字符串(来自DB),它可能包含数值。如果它包含数值,我想删除尾随的零,如:
10.0000
10.234000
str.replaceAll("\\.0*$", "")
,适用于第一个,但不适用于第二个。
许多答案指向使用BigDecimal
,但我得到的String
可能不是数字。所以我认为更好的解决方案可能是通过正则表达式。
答案 0 :(得分:66)
有可能:
1000 -> 1000
10.000 -> 10 (without point in result)
10.0100 -> 10.01
10.1234 -> 10.1234
我懒惰而且愚蠢,只是
s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");
使用包含而不是indexof的相同解决方案,如某些注释中所述,以便于理解
s = s.contains(".") ? s.replaceAll("0*$","").replaceAll("\\.$","") : s
答案 1 :(得分:16)
使用 DecimalFormat ,这是最干净的方式
String s = "10.1200";
DecimalFormat decimalFormat = new DecimalFormat("0.#####");
String result = decimalFormat.format(Double.valueOf(s));
System.out.println(result);
答案 2 :(得分:5)
我发现所有其他解决方案都太复杂了。简单地
s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");
完成这项工作。它首先尝试第一个替代方案,以便后跟所有零的点被替换为空(因为该组没有被设置)。否则,如果它找到一个点后跟一些数字(由于惰性量词*?
而尽可能少)后跟一些零,则零被丢弃,因为它们不包含在组中。 It works
我的代码依赖于我的assumption that appending a unmatched group does nothing。这适用于Oracle实现,但不适用于其他人,包括 Android ,它们似乎附加了字符串&#34; null&#34;。我打电话给这些实施,因为它可能没有意义,但他们只是correct according to the Javadoc。
答案 3 :(得分:4)
String value = "10.010"
String s = new DecimalFormat("0.####").format(Double.parseDouble(value));
System.out.println(s);
Output:
10.01
答案 4 :(得分:1)
以下适用于以下所有示例:
"1" -> "1"
"1.0" -> "1"
"1.01500" -> "1.015"
"1.103" -> "1.103"
s = s.replaceAll("()\\.0+$|(\\..+?)0+$", "$2");
答案 5 :(得分:1)
Kent's字符串操作答案神奇地起作用,也适用于精确丢失,但这里使用BigDecimal是一个更清洁的解决方案
String value = "10.234000";
BigDecimal stripedVal = new BigDecimal(value).stripTrailingZeros();
然后您可以转换为其他类型
String stringValue = stripedVal.toPlainString();
double doubleValue = stripedVal.doubleValue();
long longValue = stripedVal.longValue();
如果精确损失是您最关心的问题,那么请获取准确的原始值。如果原语的任何精度损失,这将抛出ArithmeticException。见下文
int intValue = stripedVal.intValueExact();
答案 6 :(得分:0)
如何替换
(\d*\.\d*)0*$
通过
\1
答案 7 :(得分:0)
您可以替换为:
String result = (str.indexOf(".")>=0?str.replaceAll("\\.?0+$",""):str);
使Regex尽可能简单。 (并考虑评论中指出的1000
等输入)
答案 8 :(得分:0)
首先分开小部分。然后你可以使用下面的逻辑。
BigDecimal value = BigDecimal.valueOf(345000);
BigDecimal div = new BigDecimal(10).pow(Integer.numberOfTrailingZeros(value.intValue()));
System.out.println(value.divide(div).intValue());
答案 9 :(得分:0)
我的实现可以在除法器之后选择位数:
public static String removeTrailingZero(String number, int minPrecise, char divider) {
int dividerIndex = number.indexOf(divider);
if (dividerIndex == -1) {
return number;
}
int removeCount = 0;
for (int i = dividerIndex + 1; i < number.length(); i++) {
if (number.charAt(i) == '0') {
removeCount++;
} else {
removeCount = 0;
}
}
int fracLen = number.length() - dividerIndex - 1;
if (fracLen - removeCount < minPrecise) {
removeCount = fracLen - minPrecise;
}
if (removeCount < 0) {
return number;
}
String result = number.substring(0, number.length() - removeCount);
if (result.endsWith(String.valueOf(divider))) {
return result.substring(0, result.length() - 1);
}
return result;
}
答案 10 :(得分:0)
除了肯特的答案。
在 Kotlin 中使用正则表达式时要小心。您必须手动编写Regex()
构造函数,而不是简单的字符串!
s = if (s.contains("."))
s.replace(Regex("0*\$"),"").replace(Regex("\\.\$"),"")
else s