#!/usr/bin/perl -w =head1 NAME numeros - Convert number into Spanish Text (i.e: 501 = quinientos uno) =head1 AUTHOR zeno =head1 DESCRIPTION Converts a number into its Spanish text version. Accepts input either from STDIN or will prompt the user. =head1 BUGS Sure to be some. More than likely I have messed up the grammar rules a bit on this (I was careful, but I'm not a native Spanish speaker). =head1 TO DO - Version in Catalan - Fix something with "use locale" to be able to handle commas and decimals - Allow a command line parameter to determine gender (una peseta, un euro) - Version using one really big regular expression (I like pain). =cut use strict; my $number; if (0 == (scalar @ARGV)) { print "Número/Number: "; $number = ; } else { $number = $ARGV[0]; } if ($number !~ m/^\d+$/) { die "usage: numeros num\nWhere num is made up of " . "only numbers\nnum sólo puede contener números," . " no caracteres\n"; } my $trans = look_up($number); print (($trans eq "") ? "cero\n" : "$trans\n"); sub look_up { # gets called recursively my ($input_number) = @_; my @digits=qw(uno dos tres cuatro cinco seis siete ocho nueve diez once doce trece catorce quince dieciséis diecisiete dieciocho diecinueve veinte veintiún veintidós veintitrés veinticuatro veinticinco veintiséis veintisiete veintiocho veintinueve); my @tens=qw(treinta cuarenta cincuenta sesenta setenta ochenta noventa); my $retval; if ($input_number == 0) { $retval = ""; } elsif ($input_number < @digits+1) { $retval = $digits[$input_number-1]; } elsif (int($input_number / 10)-3 < @tens) { if (($input_number % 10) == 0) { $retval = $tens[int($input_number / 10)-3]; } else { $retval = $tens[int($input_number / 10)-3] ." y ". look_up($input_number % 10); } } elsif ($input_number < 1000) { if ($input_number == 100) { $retval = "cien"; } elsif ($input_number < 199) { $retval = "ciento " . look_up($input_number % 100); } elsif (int($input_number / 100) == 5) { $retval = "quinientos" ." " . look_up($input_number % 100); } elsif (int($input_number / 100) == 7) { $retval = "setecientos" ." " . look_up($input_number % 100); } elsif (int($input_number / 100) == 9) { $retval = "novecientos" ." " . look_up($input_number % 100); } else { $retval = look_up(int($input_number / 100)) . "cientos" ." ". look_up($input_number % 100); } } elsif ($input_number < 1000000) { if ($input_number < 2000) { $retval = "mil " . look_up($input_number % 1000); } else { $retval = look_up(int($input_number / 1000)) . " mil " . look_up($input_number % 1000); } } elsif ($input_number < 1000000000000) { if ($input_number < 2000000) { $retval = "un millón " . look_up($input_number % 1000000); } else { $retval = look_up(int($input_number / 1000000)) . " millones " . look_up($input_number % 1000000); } } elsif ($input_number < 1000000000000000) { if ($input_number < 2E12) { $retval = "un billón " . look_up($input_number % 1E12); } else { $retval = look_up(int($input_number / 1E12)) . " billones " . look_up($input_number % 1E12); } } else { $retval = "Overflow/Demasiado grande" . " (limite es 999999999999999)"; } return $retval }