This is trivial with a bit of regular expression string replacement.
formatter.format(f).replaceAll("\\G0", " ")
Here it is in context: (see also on ideone.com):
DecimalFormat formatter = new java.text.DecimalFormat("0000.##");
float[] floats = {
123.45f, // 123.45
99.0f, // 99
23.2f, // 23.2
12.345f, // 12.35
.1234f, // .12
010.001f, // 10
};
for(float f : floats) {
String s = formatter.format(f).replaceAll("\\G0", " ");
System.out.println(s);
}
This uses DecimalFormat
to do most of the formatting (the zero padding, the optional #
, etc) and then uses String.replaceAll(String regex, String replacement)
to replace all leading zeroes to spaces.
The regex pattern is \G0
. That is, 0
that is preceded by \G
, which is the "end of previous match" anchor. The \G
is also present at the beginning of the string, and this is what allows leading zeroes (and no other zeroes) to be matched and replaced with spaces.
References
On escape sequences
The reason why the pattern \G0
is written as "\\G0"
as a Java string literal is because the backslash is an escape character. That is, "\\"
is a string of length one, containing the backslash.
References
Related questions
Additional tips
Note that I've used the for-each
loop, which results in a much simpler code, thus enhancing readability and minimizing chances of mistakes. I've also kept the floating point variables as float
, using the f
suffix to declare them as float
literals (since they're double
by default otherwise), but it needs to be said that generally you should prefer double
to float
.
See also