webentwicklung-frage-antwort-db.com.de

Entfernen Sie die nachfolgende Null in Java

Ich habe Strings (von DB), die numerische Werte enthalten können. Wenn es numerische Werte enthält, möchte ich folgende Nullen entfernen:

  • 10.0000
  • 10.234000

str.replaceAll("\\.0*$", ""), funktioniert auf der ersten, aber nicht auf der zweiten.

Viele Antworten weisen darauf hin, BigDecimal zu verwenden, aber die String, die ich bekomme, ist möglicherweise nicht numerisch. Ich denke, eine bessere Lösung ist wahrscheinlich die Regex.

31
fivelements

es gibt möglichkeiten:

1000    -> 1000
10.000  -> 10 (without point in result)
10.0100 -> 10.01 
10.1234 -> 10.1234

Ich bin nur faul und dumm

s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");

Dieselbe Lösung, die enthält anstelle von indexof, wie in einigen Kommentaren zum besseren Verständnis erwähnt

 s = s.contains(".") ? s.replaceAll("0*$","").replaceAll("\\.$","") : s
63
Kent

Verwenden Sie DecimalFormat , die sauberste Methode

String s = "10.1200";
DecimalFormat decimalFormat = new DecimalFormat("0.#####");
String result = decimalFormat.format(Double.valueOf(s));
System.out.println(result);
15

Ich finde die andere Lösung zu kompliziert. Einfach

s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");

macht den Job. Die erste Alternative wird zuerst versucht, sodass der Punkt, gefolgt von allen Nullen, durch nichts ersetzt wird (da die Gruppe nicht festgelegt wird). Wenn ein Punkt gefunden wird, gefolgt von einigen Ziffern (so wenige wie möglich durch den Lazy-Quantifizierer *?), gefolgt von einigen Nullen, werden die Nullen verworfen, da sie nicht in der Gruppe enthalten sind. Es klappt .

Warnung

Mein Code basiert auf meinem Annahme, dass das Anhängen einer nicht übereinstimmenden Gruppe nichts bewirkt . Dies gilt für die Oracle-Implementierung, nicht jedoch für andere, einschließlich Android, die scheinbar den String "null" anhängen. Ich würde die Implementierungen als defekt bezeichnen, da es vielleicht keinen Sinn macht, aber sie sind richtig laut Javadoc .

5
maaartinus
String value = "10.010"
String s = new DecimalFormat("0.####").format(Double.parseDouble(value));
System.out.println(s);

Output:

   10.01
4
PAC

Kent's String Manipulationsantwort funktioniert magisch und sorgt auch für Präzisionsverluste. Hier ist eine sauberere Lösung mit BigDecimal

String value = "10.234000";
BigDecimal stripedVal = new BigDecimal(value).stripTrailingZeros();

Sie können dann in andere Typen konvertieren

String stringValue = stripedVal.toPlainString();
double doubleValue = stripedVal.doubleValue();
long longValue = stripedVal.longValue();

Wenn der Präzisionsverlust für Sie äußerst wichtig ist, ermitteln Sie den genauen Grundwert. Dies würde ArithmeticException auslösen, wenn für das Grundelement ein Genauigkeitsverlust auftritt. Siehe unten

int intValue = stripedVal.intValueExact();
1
Komoo

Folgendes funktioniert für alle folgenden Beispiele: 

"1" -> "1"
"1.0" -> "1"
"1.01500" -> "1.015"
"1.103" -> "1.103"

s = s.replaceAll("()\\.0+$|(\\..+?)0+$", "$2");
1
Pit

Trennen Sie zuerst den Bruchteil aus. Dann können Sie die folgende Logik verwenden.

BigDecimal value = BigDecimal.valueOf(345000);
BigDecimal div = new BigDecimal(10).pow(Integer.numberOfTrailingZeros(value.intValue()));
System.out.println(value.divide(div).intValue());
0
Anand

Was ist mit dem Ersetzen

(\d*\.\d*)0*$

durch

\1

?

0
alestanis

Sie könnten ersetzen durch:

String result = (str.indexOf(".")>=0?str.replaceAll("\\.?0+$",""):str);

Um die Regex so einfach wie möglich zu halten. (Und berücksichtigen Sie Eingaben wie 1000, wie in Kommentaren angegeben.)

0
mdm

Meine Implementierung mit der Möglichkeit, Ziffern nach dem Teiler auszuwählen:

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;
}
0
Vadim