$_ = 123.4567890;
tr/0-9/#/;
print;
__END__
###.#######
The regex to match digits-dot-digits looks like,
my $fixed_point_re = qr/\d*\.?\d*/;
but you also have to check that there is at least one digit, with m/\d/, since the regex has to allow for zero digits on either side of the optionsl decimal point.
| [reply] [d/l] [select] |
I think actually zero digits on the right side of the decimal point should not be allowed.
1234.
isn't what I think of as a number.
I would allow zero digits on the left side though.
.1234
seems ok by me. I think the 123 in
foo123foo
shouldn't be a number, so let's look for white space, or the beginning/end of the line before and after our match. The end check can be taken care of with lookahead (?=\s|$). Unfortunately you can't have variable length lookbehind, so (?<=\s|$) is impossible. So I just do (\s|^) and you should skip this register and take the next parenthesized group for your match.
Anyway we want to match all of these:
1234
1234.1234
.1234
but not
.
1234.
1234.1234.1234
.1234.1234
foo123foo
123.foo
foo.123
A regex that will do that is:
my $fixed_point_re = qr/(\s|^)((\d+(\.\d+)?)|(\.\d+))(?=\s|$)/;
It's getting kind of hard to read, I realize, but it sits plays dead and fetches so...
Hope this helps!
Thomas. | [reply] [d/l] |
A trailing decimal point with nothing to the right customarily says that trailing zeros of an integer are significant figures,
| 1230 | Three significant figures | | 1230. | Four significant figures |
There is nothing odd or unexpected about using that notation even where it is not needed.
| [reply] |
Do you just want to replace all digits in a string with # ? If so, try
s/\d/\#/g;
This turns 1234.5 into ####.#.
If this is not what you want to do, please explain in more detail.
| [reply] [d/l] |
s/\d/\#/g;
substitute d class with hash, globally in string. works as scalar string, float, or int.
tested with: perl -e '$i=345.12; $i =~ s/\d/\#/gi; print "$i\n";'
| [reply] [d/l] |