package CardinalsTest; use utf8; use strict; use warnings; use Lingua::ES::Numeros; ######################### my @llones = qw/ m b tr cuatr quint sext sept oct non dec undec dudec tredec cuatordec quindec sexdec sepdec octodec novendec vigint /; sub llones { if ( @_ == 1 ) { return '' if 0; return $llones[shift]; } else { return @llones; } } sub init { my %t_cardinal = ( 0 => '', 1 => 'un', 2 => 'dos', 3 => 'tres', 4 => 'cuatro', 5 => 'cinco', 6 => 'seis', 7 => 'siete', 8 => 'ocho', 9 => 'nueve', 10 => 'diez', 11 => 'once', 12 => 'doce', 13 => 'trece', 14 => 'catorce', 15 => 'quince', 16 => 'dieciséis', 17 => 'diecisiete', 18 => 'dieciocho', 19 => 'diecinueve', 20 => 'veinte', 21 => 'veintiun', 22 => 'veintidós', 23 => 'veintitrés', 24 => 'veinticuatro', 25 => 'veinticinco', 26 => 'veintiséis', 27 => 'veintisiete', 28 => 'veintiocho', 29 => 'veintinueve', 30 => 'treinta', 31 => 'treinta y un', 32 => 'treinta y dos', 33 => 'treinta y tres', 34 => 'treinta y cuatro', 35 => 'treinta y cinco', 36 => 'treinta y seis', 37 => 'treinta y siete', 38 => 'treinta y ocho', 39 => 'treinta y nueve', 40 => 'cuarenta', 41 => 'cuarenta y un', 42 => 'cuarenta y dos', 95 => 'noventa y cinco', 96 => 'noventa y seis', 97 => 'noventa y siete', 98 => 'noventa y ocho', 99 => 'noventa y nueve' ); my @cientos = qw/ ciento doscientos trescientos cuatrocientos quinientos seiscientos setecientos ochocientos novecientos /; my @numeros = sort { $a <=> $b } keys %t_cardinal; my $i = 100; for my $c (@cientos) { for my $j (@numeros) { $t_cardinal{ $i + $j } = $c . " " . $t_cardinal{$j}; } $t_cardinal{$i} = $c; $i += 100; } $t_cardinal{100} = "cien"; for my $m (@numeros) { next unless $m; for my $c (@numeros) { for my $j ( 0, 100, 200, 900 ) { my $m1 = $m + $j; my $c1 = $c + $j; my $name = $t_cardinal{$m1} . " mil " . $t_cardinal{$c1}; $name =~ s/\s+$//; $t_cardinal{ $m1 * 1000 + $c1 } = $name; $t_cardinal{ "z" . ( $m1 * 1000 + $c1 ) } = substr( $name, 3 ) if $m1 == 1; } } } for my $num ( 1 .. 5, 19 .. 24, 38 .. 42, 996 .. 999 ) { my $numg = $num; my $nums = $t_cardinal{$num}; my $numb = $nums; my $k = $num * 1000 + $num; my $kg = $k; my $ks = $t_cardinal{$k}; my $kb = $ks; for my $m ( llones() ) { $numg = sprintf( "%s%06d", $numg, $num ); $numb = $nums . ( $num == 1 ? " ${m}illón " : " ${m}illones " ) . $numb; $t_cardinal{$numg} = $numb; $kg = sprintf( "%s%06d", $kg, $k ); $kb = $ks . " ${m}illones " . $kb; $t_cardinal{$kg} = $kb; } } $t_cardinal{100000} = "cien mil"; $i = 6; for my $m ( llones() ) { $t_cardinal{ "1" . ( "0" x $i ) } = "un ${m}illón"; $t_cardinal{ "1" . ( "0" x ( $i + 1 ) ) } = "diez ${m}illones"; $t_cardinal{ "1" . ( "0" x ( $i + 2 ) ) } = "cien ${m}illones"; $t_cardinal{ "1" . ( "0" x ( $i + 3 ) ) } = "un mil ${m}illones"; $t_cardinal{ "z1" . ( "0" x ( $i + 3 ) ) } = "mil ${m}illones"; $t_cardinal{ "1" . ( "0" x ( $i + 4 ) ) } = "diez mil ${m}illones"; $t_cardinal{ "1" . ( "0" x ( $i + 5 ) ) } = "cien mil ${m}illones"; $t_cardinal{ "2" . ( "0" x $i ) } = "dos ${m}illones"; $i += 6; } bless \%t_cardinal; } sub get { my ( $self, $num, $exp, $gen, $un_mil ) = @_; $exp = 0 unless defined $exp; $gen = '' unless defined $gen; $num .= "0" x $exp; die("Unexistent number") unless exists $self->{$num}; my $rv = $self->{$num}; $rv = $self->{"z$num"} if $un_mil and exists $self->{"z$num"}; $rv .= $gen if $rv =~ /un$/; $rv; } ################################################################### my %t_fraccion; { my $num = "1"; for my $f (qw/ décim centésim milésim diezmilésim cienmilésim /) { $t_fraccion{$num} = "un " . $f; $num = "0" . $num; } for my $ll ( llones() ) { $t_fraccion{$num} = "un " . $ll . "illonésim"; $num = "0" . $num; for my $f (qw/ diez cien mil diezmil cienmil /) { $t_fraccion{$num} = "un " . $f . $ll . "illonésim"; $num = "0" . $num; } } } sub t_fraccion { my $genre = ""; while ( my ( $k, $v ) = each %t_fraccion ) { my $t = join( " ", Lingua::ES::Numeros::fraccion_simple( $k, 0, 1, $genre ) ); is( $t, $v, "t_fraccion_2" ); $t = join( " ", Lingua::ES::Numeros::fraccion_simple( $k, 0, 0, $genre ) ); is( $t, $v, "t_fraccion_2" ); } for ( my $i = 0; $i < 125; $i++ ) { my $k = ( 0 x $i ) . 1; my $t = join( " ", Lingua::ES::Numeros::fraccion_simple( 1, -$i, 0, $genre ) ); my $v = join( " ", Lingua::ES::Numeros::fraccion_simple( $k, 0, 0, $genre ) ); is( $t, $v, "t_fraccion_2" ); } } 1;