Skip Menu |

This queue is for tickets about the Lingua-PT-Nums2Words CPAN distribution.

Report information
The Basics
Id: 23488
Status: open
Priority: 0/
Queue: Lingua-PT-Nums2Words

People
Owner: Nobody in particular
Requestors: ambs [...] cpan.org
Cc:
AdminCc:

Bug Information
Severity: Wishlist
Broken in: 1.06
Fixed in: (no value)



Subject: Euro values
Bem, pá, ia escrever em inglês, mas não vale a pena. Queria gerar recibos. Queria que o teu módulo gerasse linhas de euros. Não é complicado. Eu posso fazer isso (com sorte até te podia mandar um patch). sub euro { my $value = shift; my $integer = int($value); my $decimal = $value - $integer; if ($decimal) { sprintf("%s euros e %s centimos", nums2words($integer), nums2words($decimal*100)) } else { sprintf("%s euros", nums2words($integer)); } } Não testei o código, claro. Foi só uma ideia assim da cabeça para os pés.
A minha funcao actual. Nao funciona caso o valor seja 1000.05, por exemplo, em que ao fazer 1000.05-1000 o perl se passa com a precisao. sub format_euros { my $value = shift; my $integer = int($value); my $decimal = $value - $integer; my $euro = $integer == 1 ? "euro" : "euros"; if ($decimal) { $decimal *= 100; if ($decimal eq "1") { # doesn't work with ==, do not know why return sprintf("%s %s e 1 cêntimo", num2word($integer), $euro); } else { return sprintf("%s %s e %s cêntimos", num2word($integer), $euro, num2word($decimal)); } } else { return sprintf("%s %s", num2word($integer), $euro); } }
Esta worka :) <Alias> Are you working with money? <ambs> yes <Alias> ALWAYS treat money as integers <Alias> I cannot stress that enough <ambs> heh <Alias> So you record money as cents <ambs> take the value, multiply 100 and use it then <ambs> let me try sub format_euros { my $value = shift; my $integer = int($value); $value*=100; my $decimal = $value % 100; my $euro = $integer == 1 ? "euro" : "euros"; if ($decimal) { if ($decimal eq "1") { # doesn't work with ==, do not know why return sprintf("%s %s e 1 cêntimo", num2word($integer), $euro); } else { return sprintf("%s %s e %s cêntimos", num2word($integer), $euro, num2word($decimal)); } } else { return sprintf("%s %s", num2word($integer), $euro); } }
Nova iteração. De acordo com o #perl, use regexps como melhor forma de manusear dinheiro. Até ficou mais pequena :-D sub format_euros { my $value = shift; $value =~ m!^(\d+)\.(\d+)$!; my ($integer,$decimal) = ($1,$2); my $euro = $integer == 1 ? "euro" : "euros"; if ($decimal) { if ($decimal == 1) { return sprintf("%s %s e 1 cêntimo", num2word($integer), $euro); } else { return sprintf("%s %s e %s cêntimos", num2word($integer), $euro, num2word($decimal)); } } else { return sprintf("%s %s", num2word($integer), $euro); } }
Garanto que é a última versão... de hoje :) sub format_euros { my $value = shift; $value =~ m!^(\d+)\.(\d+)$!; my ($integer,$decimal) = ($1,$2); my $euro = $integer == 1 ? "euro" : "euros"; if ($decimal != 0) { if ($decimal == 1) { return sprintf("%s %s e 1 cêntimo", num2word($integer), $euro); } else { return sprintf("%s %s e %s cêntimos", num2word($integer), $euro, num2word($decimal)); } } else { return sprintf("%s %s", num2word($integer), $euro); } }
Afinal nao foi. Nao sei se estas de acordo em meter uma funcao destas no modulo. Se sim, e se usas o svn do Natura (que acho que nao usas porque nao tens a password), eu ate' ajudava a escrever testes. Ainda nao funciona bem se passares '.05' sem o 0 inicial. Inteh sub format_euros { my $value = shift; my ($integer, $decimal); if ($value =~ m!^(\d+)\.(\d+)$!) { ($integer,$decimal) = ($1,$2); } else { ($integer,$decimal) = ($value, 0); } my $euro = $integer == 1 ? "euro" : "euros"; my $cent = $decimal == 1 ? "cêntimo" : "cêntimos"; if ($decimal != 0) { if ($integer != 0) { return sprintf("%s %s e %s %s", num2word($integer), $euro, num2word($decimal), $cent); } else { return sprintf("%s %s", num2word($decimal), $cent); } } else { return sprintf("%s %s", num2word($integer), $euro); } }