Wing Poon Wing Poon - 5 months ago 10
Java Question

Regex to truncate trailing zeroes

I'm trying to construct a single regex (for Java) to truncate trailing zeros past the decimal point. e.g.


  • 50.000 → 50

  • 50.500 → 50.5

  • 50.0500 → 50.05

  • -5 → -5

  • 50 → 50

  • 5.5 → 5.5



Idea is to represent the real number (or integer) in the most compact form possible.

Here's what I've constructed:

^(-?[.0-9]+?)\.?0+$


I'm using
$1
to capture the truncated number string.

The problem with the pattern above is that 50 gets truncated to 5. I need some way to express that the
0+
must follow a
.
(decimal point).

I've tried using negative-behind, but couldn't get any matches.

Answer

The best solution could be using built-in language-specific methods for that task.

If you cannot use them, you may use

^(-?\d+)(?:\.0+|(\.\d*?)0+|\.+)?$

And replace with $1$2.

See the regex demo. Adjust the regex accordingly. Here is the explanation:

  • ^ - start of string
  • (-?\d+) -Group 1 capturing 1 or 0 minus symbols and then 1 or more digits
  • (?:\.0+|(\.\d*?)0+|\.+)? - An optional (matches 1 or 0 times due to the trailing ?) non-capturing group matching 3 alternatives:
    • \.0+ - a decimal point followed with 1+ zeros
    • (\.\d*?)0+ - Group 2 capturing a dot with any 0+ digits but as few as possible and matching 1+ zeros
    • \.+ - (optional branch, you may remove it if not needed) - matches the trailing dot(s)
  • $ - end of string.

Java demo:

String s = "50.000\n50\n50.100\n50.040\n50.\n50.000\n50.500\n50\n-5";
System.out.println(s.replaceAll("(?m)^(-?\\d+)(?:\\.0+|(\\.\\d*?)0+|\\.+)?$", "$1$2"));
// => [50, 50, 50.1, 50.04, 50, 50, 50.5, 50, -5]