use Scalar::Util qw( looks_like_number );
my $s = 123.45;
$s =~ s/\./,/ if looks_like_number($s);
Works even better than setlocale because you are surely starting with the number in string form if you don't know whether a column contains a number or not. | [reply] [Watch: Dir/Any] [d/l] |
use Scalar::Util qw( looks_like_number );
print looks_like_number('12,48');
# --> 0
He's PARSING a csv (or more probably a tab or semicolon separated file) so he needs to go exactly the other way around. Accept 12,48 and treat it as a number.
Jenda
Enoch was right!
Enjoy the last years of Rome.
| [reply] [Watch: Dir/Any] [d/l] |
I don't think so. That's the opposite of what he said (changing the decimal point from "." to ","), and it's the opposite of what his code does.
I see what you mean, but it still make no sense since he says setlocale works.
$ perl -we'use POSIX; setlocale LC_NUMERIC, "fr_FR"; print 0+"123,45"'
Argument "123,45" isn't numeric in addition (+) at -e line 1.
123
| [reply] [Watch: Dir/Any] [d/l] [select] |
Or... I suppose if we have a digit either size of a '.' then it's probably a number with a decimal point:
$s = "123.45";
$s =~ s/(?<=\d)\.(?=\d)/,/;
ALthough... I don't quite understand what you're trying to do - surely if you're parsing a CSV file containing numbers with decimal points you'd rather they weren't commas? | [reply] [Watch: Dir/Any] [d/l] |
The motivation is a feature for the module described in RFC: Text::CSV::R. It is an option to set the decimal point. In Germany for example, it is common for CSV files to use a comma as decimal point and a semicolon as field separator.
So I guess a locale approach would be the performance-wise fastest solution. But setting the locale to an arbitrary locale which uses a comma (de_DE, fr_Fr,...) just to change this single parameter seems like hack.
| [reply] [Watch: Dir/Any] |
| [reply] [Watch: Dir/Any] [d/l] [select] |