in reply to Using Regular Expressions to Simulate sprintf() function - One Liner Challenge
sub a{$_=int$_[0]*10**$_[1];s;(.{$_[1]})$;\.$1;;return$_};
This subroutine, while not particularly robust, takes two arguments, the number to format and the formatting precision - For example, the following code formats to single decimal precision:
my @a = ("1.10", "2.22"); print STDOUT &a($_, 1) for @a; sub a{$_=int$_[0]*10**$_[1];s;(.{$_[1]})$;\.$1;;return$_};
Update: After running this code through the test-suite written by Albannach, I would probably modify my subroutine as follows to clean up the subroutine output so that a trailing '.' isn't left at the end of a number if there is no decimals to follow it and to add rounding:
sub a{$_=int$_[0]*10**$_[1]+.5;s;(.{$_[1]})$;\.$1;;chop if substr($_,- +1)eq'.';return$_};
And the result ...
value|precision sprintf Incognito Albannach jeffa r +ob_au '123.45678'|3: 123.457 123.456 123.456 123 12 +3.457 '12.4'|1: 12.4 12.4 12.4 12 + 12.4 ''|0: 0 + 0 '3.14'|5: 3.14000 3.14000 3.14000 00003.14 3. +14000 '1'|5: 1.00000 1.00000 1.00000 00001 1. +00000 '.5'|0: 0 + 1 '10'|5: 10.00000 10.00000 10.00000 00010 10. +00000 '12.45435'|0: 12 12 12 12 + 12 '100'|5: 100.00000 100.00000 100.00000 00100 100. +00000 '3.'|0: 3 3 3 3 + 3 '1000'|5: 1000.00000 1000.00000 1000.00000 01000 1000. +00000 '12.56'|0: 13 12 12 12 + 13
Ooohhh, Rob no beer function well without!
|
|---|