数値を含む可能性のある(DBからの)文字列があります。数値が含まれている場合は、次のような末尾のゼロを削除したいと思います。
10.0000
-
10.234000
str.replaceAll("\\.0*$", "")
、最初のものでは機能しますが、2番目のものでは機能しません。
答えの多くは使用することを示しています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);
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");
仕事をします。最初の選択肢が最初に試行されるため、ドットの後にすべてゼロが続くものは何も置き換えられません (グループが設定されないため)。それ以外の場合、ドットの後にいくつかの数字が続き (lazy quantifier により可能な限り少ない数*?
)、その後にいくつかのゼロが続く場合、ゼロはグループに含まれていないため破棄されます。それは動作します。
私のコードは、一致しないグループを追加しても何も起こらないという私の仮定に依存しています。これは Oracle 実装には当てはまりますが、文字列「null」を追加するように見えるAndroidなどの他の実装には当てはまりません。意味がないかもしれないので、そのような実装は壊れていると呼びますが、 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
(そして、コメントで指摘されているような入力を考慮してください)
最初に分数部分を分離します。次に、以下のロジックを使用できます。
BigDecimal value = BigDecimal.valueOf(345000);
BigDecimal div = new BigDecimal(10).pow(Integer.numberOfTrailingZeros(value.intValue()));
System.out.println(value.divide(div).intValue());