J'ai des chaînes (de DB), qui peuvent contenir des valeurs numériques. S'il contient des valeurs numériques, j'aimerais supprimer les zéros de fin, tels que:
10.0000
10.234000
str.replaceAll("\\.0*$", "")
, travaille sur le premier, mais pas le second.
Beaucoup de réponses suggèrent d'utiliser BigDecimal
, mais la String
que je reçois peut ne pas être numérique. Donc, je pense qu'une meilleure solution passe probablement par le regex.
il y a des possibilités:
1000 -> 1000
10.000 -> 10 (without point in result)
10.0100 -> 10.01
10.1234 -> 10.1234
Je suis paresseux et stupide, juste
s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");
Même solution en utilisant contient au lieu de indexof comme mentionné dans certains des commentaires pour faciliter la compréhension
s = s.contains(".") ? s.replaceAll("0*$","").replaceAll("\\.$","") : s
Utilisez DecimalFormat , sa manière la plus propre
String s = "10.1200";
DecimalFormat decimalFormat = new DecimalFormat("0.#####");
String result = decimalFormat.format(Double.valueOf(s));
System.out.println(result);
Je trouve toute autre solution trop compliquée. Simplement
s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");
fait le travail. Il essaie d'abord la première alternative, de sorte que le point suivi de tous les zéros ne soit remplacé par rien (car le groupe n'est pas défini). Sinon, s'il trouve un point suivi de quelques chiffres (le moins possible en raison du quantificateur lazy *?
) suivi de quelques zéros, ceux-ci sont ignorés car ils ne sont pas inclus dans le groupe. Ça marche .
Mon code repose sur mon supposer que l'ajout d'un groupe sans correspondance ne fait rien }. Cela est vrai pour l'implémentation Oracle, mais pas pour les autres, y compris Android, qui semblent ajouter la chaîne "null". J'appellerais ces implémentations comme étant cassées car cela n'a aucun sens, mais elles sont correctes selon le Javadoc .
String value = "10.010"
String s = new DecimalFormat("0.####").format(Double.parseDouble(value));
System.out.println(s);
Output:
10.01
Kent Réponse de manipulation des cordes fonctionne comme par magie et prend également en charge la perte de précision. Mais voici une solution plus propre utilisant BigDecimal
String value = "10.234000";
BigDecimal stripedVal = new BigDecimal(value).stripTrailingZeros();
Vous pouvez ensuite convertir en d'autres types
String stringValue = stripedVal.toPlainString();
double doubleValue = stripedVal.doubleValue();
long longValue = stripedVal.longValue();
Si la perte de précision est une préoccupation majeure pour vous, obtenez la valeur primitive exacte. Cela lève ArithmeticException s'il y a perte de précision pour la primitive. Voir ci-dessous
int intValue = stripedVal.intValueExact();
Ce qui suit fonctionne pour tous les exemples suivants:
"1" -> "1"
"1.0" -> "1"
"1.01500" -> "1.015"
"1.103" -> "1.103"
s = s.replaceAll("()\\.0+$|(\\..+?)0+$", "$2");
Séparez d'abord la fraction. Ensuite, vous pouvez utiliser la logique ci-dessous.
BigDecimal value = BigDecimal.valueOf(345000);
BigDecimal div = new BigDecimal(10).pow(Integer.numberOfTrailingZeros(value.intValue()));
System.out.println(value.divide(div).intValue());
Qu'en est-il de remplacer
(\d*\.\d*)0*$
par
\1
?
Vous pouvez remplacer par:
String result = (str.indexOf(".")>=0?str.replaceAll("\\.?0+$",""):str);
Pour garder le regex aussi simple que possible. (Et tenez compte d'entrées comme 1000
comme indiqué dans les commentaires)
Mon implémentation avec possibilité de sélectionner des nombres de chiffres après le diviseur:
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;
}