# This is how it works: # resolve(300) # returns "three hundred" # resolve(210) # returns "two hundred ten" # and so on... # Note that this is based on the Brittish system because that is close to my # native system (Dutch). # So maybe some American (oriented) people might think it's wrong, but it's # just no American oriented code. # Currently, it only takes positive integer numbers. # That is: $x > 0 && $x / 2 == int($x / 2) sub resolve { my @numbers1 = qw( one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty ); my @numbers2 = qw( ten twenty thirty fourty fifty sixty seventy eighty ninety ); my @numbers3 = qw( thousand million milliard billion billiard trillion trilliard quadrillion quadrilliard quintillion quintilliard sextillion sextilliard septillion septilliard octillion octilliard nonillian nonilliard decillion decilliard ); my $nr = int $_[0]; $nr = "$nr"; $nr =~ s/\D//g; $nr = $nr ? $nr : "0"; if ($nr eq "0") { return ""; } my ($smallone, $bigone, $cnr, @allnumbers, $resolve); if ($nr < 20) { return $numbers1[$nr-1]; } elsif ($nr < 100) { ($nr, $cnr) = $nr =~ m/^(.)(.)$/; $smallone = &resolve($cnr); $bigone = $numbers2[$nr-1]; return "$bigone" . ($smallone ? "-$smallone" : ""); } elsif ($nr < 1000) { ($nr, $cnr) = $nr =~ m/^(.)(..)$/; $cnr = &resolve($cnr); $nr = &resolve($nr); return "$nr hundred $cnr"; } else { $nr = reverse $nr; $nr =~ s/(\d{3})/$1 /g; $nr = reverse $nr; @allnumbers = split(" ", $nr); while (@allnumbers) { $cnr = shift @allnumbers; $bigone = &resolve($cnr); if ($#allnumbers > -1 && $cnr > 0) { $bigone .= " $numbers3[$#allnumbers] "; } $resolve .= $bigone; } return $resolve; } }