-3

これは、文字列から末尾の小数とゼロを削除するための適切な正規表現ですか?動作させることができません。私は何が欠けていますか?

78.80-> 78.8

str.replaceAll("^.0*$", "");

私は78.008が78.01であるべきであるように2つの小数点だけを必要とします

そしてそれが78.10の場合は78.1のみ。

4

3 に答える 3

3

いいえ、正しい正規表現はもっと複雑で、肯定的な後読みが必要です。

str = str.replaceAll("\\.0*$|(?<=\\.[0-9]{0,2147483646})0*$", "");

をエスケープする必要があります.。それ以外の場合は「任意の文字」を意味するため、正規表現を文字列の最後にのみ固定する必要があり、数字はオプションのゼロ以外の数字の0後にある必要があると言わなければなりません。.

補遺: 処理すべき「特別なケース」があります: 1.00. を使って対処してい|ます。最初のサブ式は、「ドットとゼロのみ」を意味し、ドットにも一致します (この方法で削除されます)。

また、Java では文字列は不変であるためreplaceAll、新しい文字列が作成されることに注意してください。

の使用に注意してください{0,2147483646}: a を使用すると、が*得られます。 signed int) ドットのマイナス 1。Look-behind group does not have an obvious maximum length*{0,2147483647}\\.

テスト例: http://ideone.com/0NDTSq

于 2013-02-22T07:36:36.393 に答える
2

数値を四捨五入する必要があるため、正規表現は使用しないでください。使用する必要がありますDecimalFormat

DecimalFormat twoDForm = new DecimalFormat("#.#");
Double d = Double.parseDouble("123.078");
String s = twoDForm.format(d);
System.out.println(s);

出力します:

123.08
于 2013-02-22T07:51:02.713 に答える
1

アンカー^を使用$すると、文字列全体を一致させて置き換えようとしています。文字列にはさらに多くの文字列があるため、これは一致しません。

これを試して

 str.replace("0*$", "");

を使用0*$すると、文字列の末尾に 0 個以上の「0」のみが一致します。

注:これも「1000」を「1」に変更します。

于 2013-02-22T07:37:54.343 に答える