my @units
my @teens
my @tens
You only need this:
my %number = (
0 => zero, 1 => one, 2 => two, 3 => three, 4 => four, 5 => five, 6 =>
+six, 7 => seven, 8 => eight, 9 => nine, 10 => ten, 11 => eleven, 12 =
+> twelve, 13 => thirteen, 14 => fourteen, 15 => fifteen, 16 => sixtee
+n, 17 => seventeen, 18 => eighteen, 19 => nineteen, 20 => twenty, 30
+=> thirty, 40 => forty, 50 => fifty, 60 => sixty, 70 => seventy, 80 =
+> eighty, 90 => ninety);
No, you don't need a bigger hash, you could make it bigger but this is not necessary probably.
2 - pick up the whole number, by your preferred method, maybe a regex \d{1,}. Store the number in a variable
3 -Proceed to parse the number
if $number is a key in the hash, print its value, end of the history
else you need to reduce the problem
while $number is not undef
extract the last number of the chain with pop
if the popped number = 0 forget this number
else my $units = this number
pop again
if you have a zero: good bye zero!
else my $teen = this number *10
pop again
if you have a zero: good bye zero!
else my $hundred = this number
my $thereis_a_hundred = true;
... etc, etc ...
pop again ... oups, nothing left to pop, we obtain undef and ex
+it the loop,
my $googolplex = ''; # this variable was not reached, its value
+is still the null string, so if you print it nothing occurs
}
## print all variables you have collected in reversed position and a
+dd some extra strings
## first whe prepare the extra chains, this could be done before also
if ($there_is_hundred is true){my $hundred_str = "hundred and "}
else {$hundred_str = ''};
if ($there_is_thousand is true){my $thousand_string = " thousand, "}
else {$thousand_string = ''};
# ... etc
# we finish
print ....... %number[$thousand] $thousand_string %number[$hundred]
+ $hundred_str %number[$teen], %number[$unit];
# and we close all with the required "}"
This is more or less all that you need, of course you can refine the idea a lot: you can simplify the idea behind there_is_hundred / hundred_str and do all in one steep with one variable, you should also do something with floating numbers, and you should aware that billion could be a very different creature in Europe and in USA and, and, and...
But in any case, the idea behind all is very simple. Treat the number as a chain, pop the numbers one by one until you have undef, eval the number each time, fill as many variables as digits you have and print all together at the end, including the invisible null variables |