package pronounce_number; # Package Stuff. use Exporter; @ISA=(Exporter); @EXPORT=('pronounce_number', 'set_format'); my @v = ( [ '', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'], [ '', 'ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety' ]); my @m = ('', ' million', ' billion', ' trillion', ' quadrillion', ' quintillion'); my @g = ('', ' thousand'); my @h=('',' hundred'); my @and=('',' and '); my %format = ( space=>'', point=>'point'); sub set_format { %format = @_; } sub integer_grammar($) { my ($u,$t,$h) = reverse(split//,$_[0]); return $v[0]->[$h].$h[!!$h].$and[!!($h&&($t||$u))].$v[!(1==$t&&($u+=10)&&($t=0))]->[$t].$format{'space'}.$v[0]->[$u]; } sub float_grammar($) { $_[0]=~s/(\d)/$v[0]->[$1] /geo; return $_[0]; } sub magnitude_grammar { return $g[(($_[0]-1)/3)%2].$m[$_[0]/6 * !!($_[0]%6)].' '; } sub pronounce_integer($) { $_=join("",(reverse(split//,$_[0]))); my ($i,$n,@l)=(0,"",()); foreach $n(/(\d{1,3})/g) { $n=join("",(reverse(split//,$n))); $i+=length($n); push @l,($n && defined(@l))?magnitude_grammar($i):"",integer_grammar($n); } return join('',reverse(@l)); } sub pronounce_float($) { my @n=split/\./,$_[0]; return pronounce_integer($n[0])." $format{'point'} ".float_grammar($n[1]); } sub pronounce_ip($) { return join(" $format{'point'} ",map{pronounce_integer($_)}(split/\./,$_[0])); } my @process_array=(\&pronounce_integer,\&pronounce_float,\&pronounce_ip); sub pronounce_number($) { my $string = $_[0]; $string =~ s/,//g; $_ = ($string =~ s/\./\./g); return &{$process_array[($_<=$#process_array)?$_:2]}($string) }