[英]Remove trailing zero in Java
我有字符串(來自數據庫),其中可能包含數值。 如果它包含數值,我想刪除尾隨零,例如:
10.0000
10.234000
str.replaceAll("\\.0*$", "")
,適用於第一個,但不適用於第二個。
很多答案都指向使用BigDecimal
,但我得到的String
可能不是數字。 所以我認為更好的解決方案可能是通過正則表達式。
有以下可能性:
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("\\.$", "");
使用contains
而不是indexOf
相同解決方案,如一些評論中所述,以便於理解
s = s.contains(".") ? s.replaceAll("0*$","").replaceAll("\\.$","") : s
使用DecimalFormat ,它最干凈的方式
String s = "10.1200";
DecimalFormat decimalFormat = new DecimalFormat("0.#####");
String result = decimalFormat.format(Double.valueOf(s));
System.out.println(result);
Kent 的字符串操作答案神奇地起作用並且還可以滿足精度損失,但是這里有一個使用 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();
String value = "10.010"
String s = new DecimalFormat("0.####").format(Double.parseDouble(value));
System.out.println(s);
Output:
10.01
我發現所有其他解決方案都太復雜了。 簡單地
s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");
做這項工作。 它首先嘗試第一個選擇,以便點后跟全零被空替換(因為組沒有被設置)。 否則,如果它發現一個點后跟一些數字(由於惰性量詞*?
盡可能少),后跟一些零,這些零將被丟棄,因為它們不包含在組中。 它有效。
我的代碼依賴於我的假設,即附加一個不匹配的組沒有任何作用。 這適用於 Oracle 實現,但不適用於其他實現,包括Android ,它們似乎附加了字符串“null”。 我將這些實現稱為破壞,因為它可能沒有意義,但根據 Javadoc它們是正確的。
以下適用於所有以下示例:
"1" -> "1"
"1.0" -> "1"
"1.01500" -> "1.015"
"1.103" -> "1.103"
s = s.replaceAll("()\\.0+$|(\\..+?)0+$", "$2");
換了怎么辦
(\d*\.\d*)0*$
經過
\1
?
您可以替換為:
String result = (str.indexOf(".")>=0?str.replaceAll("\\.?0+$",""):str);
使正則表達式盡可能簡單。 (並考慮到評論中指出的1000
輸入)
我的實現可以在除法器后選擇位數:
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;
}
除了肯特的回答。
小心Kotlin 中的正則表達式。 您必須手動編寫Regex()
構造函數而不是簡單的字符串!
s = if (s.contains("."))
s.replace(Regex("0*\$"),"").replace(Regex("\\.\$"),"")
else s
嘗試使用此代碼:
DecimalFormat df = new DecimalFormat("#0.#####");
String value1 = df.format(101.00000);
String value2 = df.format(102.02000);
String value3 = df.format(103.20000);
String value4 = df.format(104.30020);
Output:
101
102.02
103.2
104.3002
首先分離出分數部分。 然后你可以使用下面的邏輯。
BigDecimal value = BigDecimal.valueOf(345000);
BigDecimal div = new BigDecimal(10).pow(Integer.numberOfTrailingZeros(value.intValue()));
System.out.println(value.divide(div).intValue());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.