簡體   English   中英

刪除 Java 中的尾隨零

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM