最後の 0 のセットを 10 進数で一致させようとしています。例: In9780.56120000
0000
が一致します。この正規表現:
(?<=\.\d{0,20})0*$
RegexBuddy では動作するようですが、Java では次のエラーで失敗します。
後読みパターン マッチの最大長は、インデックス 15 付近に制限されている必要があります
誰でもこの問題について洞察を提供できますか?
最後の 0 のセットを 10 進数で一致させようとしています。例: In9780.56120000
0000
が一致します。この正規表現:
(?<=\.\d{0,20})0*$
RegexBuddy では動作するようですが、Java では次のエラーで失敗します。
後読みパターン マッチの最大長は、インデックス 15 付近に制限されている必要があります
誰でもこの問題について洞察を提供できますか?
Javaは「無制限」であると解釈{0,20}
していますが、これはサポートされていません。
なぜあなたは後ろを見る必要がありますか?代わりに、キャプチャしないグループを使用してください。
(?:\.\d*)0*$
文字列の10進数から末尾のゼロを削除するには、次の1行を使用します。
input.replaceAll("(\\.(\\d*[1-9])?)0+", "$1");
ここにいくつかのテストコードがあります:
public static void main(String[] args) {
String input = "trim 9780.56120000 and 512.0000 but not this00, 00 or 1234000";
String trimmed = input.replaceAll("(\\.(\\d*[1-9])?)0+", "$1");
System.out.println(trimmed);
}
出力:
trim 9780.5612 and 512. but not this00, 00 or 1234000
末尾のゼロしかない場合に処理して小数点も削除する場合、つまりはに"512.0000"
なります"512"
が"123.45000"
、小数点は保持されます。つまり"123.45"
、次のようにします。
String trimmed = input.replaceAll("(\\.|(\\.(\\d*[1-9])?))0+\\b", "$2");
その他のテストコード:
public static void main(String[] args) {
String input = "trim 9780.56120000 and 512.0000 but not this00, 00 or 1234000";
String trimmed = input.replaceAll("(\\.|(\\.(\\d*[1-9])?))0+\\b", "$2");
System.out.println(trimmed);
}
出力:
trim 9780.5612 and 512 but not this00, 00 or 1234000
I ended up not using regular expressions at all and decided to just loop through each character of the decimal starting at the end and working backwards. Here's the implementation I used. Thanks to Bohemian for pushing me in the right direction.
if(num.contains(".")) { // If it's a decimal
int i = num.length() - 1;
while(i > 0 && num.charAt(i) == '0') {
i--;
}
num = num.substring(0, i + 1);
}
Code based off the rtrim
function found here: http://www.fromdev.com/2009/07/playing-with-java-string-trim-basics.html
Edit: And here's something to remove the decimal for this solution.
// Remove the decimal if we don't need it anymore
// Eg: 4.0000 -> 4. -> 4
if(num.substring(num.length() - 1).equals(".")) {
num = num.substring(0, num.length() - 1);
}