fiv*_*nts 35 java regex string
我有字符串(来自DB),它可能包含数值.如果它包含数值,我想删除尾随零,例如:
10.000010.234000str.replaceAll("\\.0*$", "")适用于第一个,但不适用于第二个.
很多答案指向使用BigDecimal,但String我得到的可能不是数字.所以我认为更好的解决方案可能是通过正则表达式.
Ken*_*ent 74
有可能:
1000 -> 1000
10.000 -> 10 (without point in result)
10.0100 -> 10.01
10.1234 -> 10.1234
Run Code Online (Sandbox Code Playgroud)
我是懒惰和愚蠢的
s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");
Run Code Online (Sandbox Code Playgroud)
使用包含而不是indexof的相同解决方案,如一些注释中所提到的,以便于理解
s = s.contains(".") ? s.replaceAll("0*$","").replaceAll("\\.$","") : s
Run Code Online (Sandbox Code Playgroud)
Sru*_*lla 18
使用最简洁的DecimalFormat
String s = "10.1200";
DecimalFormat decimalFormat = new DecimalFormat("0.#####");
String result = decimalFormat.format(Double.valueOf(s));
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
小智 11
Kent 的字符串操作答案神奇地起作用并且还可以满足精度损失,但是这里有一个使用 BigDecimal 的更清洁的解决方案
String value = "10.234000";
BigDecimal stripedVal = new BigDecimal(value).stripTrailingZeros();
Run Code Online (Sandbox Code Playgroud)
然后您可以转换为其他类型
String stringValue = stripedVal.toPlainString();
double doubleValue = stripedVal.doubleValue();
long longValue = stripedVal.longValue();
Run Code Online (Sandbox Code Playgroud)
如果精度损失是您最关心的问题,那么获取精确的原始值。如果原语有任何精度损失,这将抛出 ArithmeticException。见下文
int intValue = stripedVal.intValueExact();
Run Code Online (Sandbox Code Playgroud)
我发现所有其他解决方案都太复杂了.只是
s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");
Run Code Online (Sandbox Code Playgroud)
做的工作.它首先尝试第一个替代方案,以便后跟所有零的点被替换为空(因为该组未被设置).否则,如果它找到一个点后跟一些数字(由于延迟量词而尽可能少*?)后跟一些零,则零被丢弃,因为它们不包含在组中.它有效.
我的代码依赖于我的假设,即追加一个不匹配的组什么都不做.这对于Oracle实现来说是正确的,但对于包括Android在内的其他人来说却是如此,它们似乎附加了字符串"null".我打电话给这样的实现,因为它可能没有意义,但根据Javadoc它们是正确的.
String value = "10.010"
String s = new DecimalFormat("0.####").format(Double.parseDouble(value));
System.out.println(s);
Output:
10.01
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51080 次 |
| 最近记录: |