[tpm] currency deformatter
Ilia
samogon at gmail.com
Thu Feb 5 10:18:34 PST 2009
Very nice Indy! Still don't think this deserves to be a module on CPAN?
ilia.
On Thu, Feb 5, 2009 at 12:19 PM, Indy Singh <indy at indigostar.com> wrote:
> I missed that one. Here is a more comprehensive solution that deals with
> your test cases. It guesses the format based on the string, however there
> are cases that are ambiguous. For a full solution you would need to feed in
> information as to the decimal separator based on locale.
>
> Here are the cases that could be a problem:
> $123.456 can be considered as 123.456 or 123456.00
> $123,456 can be considered as 123.456 or 123456.00
>
> If I missed anything, I leave it as an exercise to the reader.
>
> currency('$65,345.89'); # case 1
> currency('$65.345,89'); # case 2
> currency('$24,969.00(txincl.)'); # case 3
> currency('$24,969.00*'); # case 4
>
> currency('$123,456,789'); # case 5 whole number
> currency('$123.456.789'); # case 6 whole number
>
> currency('$123,456'); # case 7
> currency('$123.456'); # case 8
>
>
> sub currency
> {
> my ($x) = @_;
> my ($c) = $x =~ /([0-9\.,]+)/; # this gets any sequence of digits,
> periods, and commas
>
> my @p = $c =~ /([,\.])/g; # get a list of puncuation characters
> (, or .)
>
>
> if (@p == 1 && @p[0] eq '.') {
> # string has just one period, assume it is a decimal seperator
> }
> elsif (@p == 1 && @p[0] eq ',') {
> # string has just one comma, assume it is a decimal seperator, replace
> with period
> $c =~ s/,/./;
> }
> elsif (@p > 1 && @p[@p-1] ne @p[0] && @p[@p-1] eq '.') {
> # case 1, 3, 4
> $c =~ s/,//g;
> }
> elsif (@p > 1 && @p[@p-1] ne @p[0] && @p[@p-1] eq ',') {
> # case 2
> $c =~ s/\.//g;
> $c =~ s/,/./;
> }
> else {
> # no puncutation or multiple punctuation characters all the same
> # case 5 or 6
> $c =~ s/\.//g;
> $c =~ s/,//g;
> }
> print "$x -> $c\n";
> }
>
>
>
>
>
>
> Indy Singh
> IndigoSTAR Software -- www.indigostar.com
>
>
> ----- Original Message ----- From: "Ilia" <samogon at gmail.com>
> To: "Indy Singh" <indy at indigostar.com>; <tpm at to.pm.org>
> Sent: Thursday, February 05, 2009 11:28 AM
> Subject: Re: [tpm] currency deformatter
>
>
>> 1..4
>> ok 1 - fixup $65,345.89
>> not ok 2 - fixup $65.345,89
>> # Failed test 'fixup $65.345,89'
>> # at agency_fix_contract_value.t line 18.
>> # got: '65.34589'
>> # expected: '65345.89'
>> ok 3 - fixup $65,345.89(txincl.)
>> ok 4 - fixup $65,345.89*
>> # Looks like you failed 1 test of 4.
>>
>>
>> On Thu, Feb 5, 2009 at 11:07 AM, Indy Singh <indy at indigostar.com> wrote:
>>>
>>> The code below will do what you want for your test cases. I'm not sure
>>> that
>>> two lines of code justifies a whole module.
>>>
>>> $x = '$24,969.00(txincl.)';
>>> ($c) = $x =~ /([0-9\.,]+)/;
>>> $c =~ s/,//g;
>>> print "$x -> $c\n";
>>>
>>> Indy Singh
>>> IndigoSTAR Software -- www.indigostar.com
>>>
>>>
>>> ----- Original Message ----- From: "Ilia" <samogon at gmail.com>
>>> To: <tpm at to.pm.org>
>>> Sent: Thursday, February 05, 2009 10:29 AM
>>> Subject: [tpm] currency deformatter
>>>
>>>
>>>> I can't believe there doesn't seem to be a CPAN module to parse a
>>>> currency into a decimal.
>>>>
>>>> The function I'm looking for should return a decimal based on various
>>>> input like:
>>>> $65,345.89
>>>> $65.345,89
>>>> $24,969.00(txincl.)
>>>> $24,969.00*
>>>>
>>>> any extraneous data like "(txincl.)" should be removed. any spaces
>>>> should be removed.
>>>>
>>>> Any takers?
>>>>
>>>> ilia.
>>>> _______________________________________________
>>>> toronto-pm mailing list
>>>> toronto-pm at pm.org
>>>> http://mail.pm.org/mailman/listinfo/toronto-pm
>>>
>>>
>>
>>
>>
>> --
>> Ilia Lobsanov
>> Nurey Networks - http://www.nurey.com
>> New Ideas for a New Economy
>> Python, Perl, Java, Linux & more
>> Toronto +1 647 996 9087
>> Boston +1 781 328 1162
>
>
--
Ilia Lobsanov
Nurey Networks - http://www.nurey.com
New Ideas for a New Economy
Python, Perl, Java, Linux & more
Toronto +1 647 996 9087
Boston +1 781 328 1162
More information about the toronto-pm
mailing list