Numero in forma letterale

Stato
Discussione chiusa ad ulteriori risposte.

R4z0r_Cr4sH

Utente Electrum
10 Giugno 2007
501
11
6
148
Dato un numero intero positivo (in input o come parametro) restituire in modo letterale.Esempio se io inserisco "28" mi deve restituire "ventotto".

il mio in java (arriva fino a 9999,inutile farlo andare di più tanto il ragionamento è sempre lo stesso :D):
Codice:
public class Convertitore{
    String[] n1={"zero","uno","due","tre","quattro","cinque","sei","sette","otto","nove","dieci","undici","dodici","tredici",
                     "quattordici","quindici","sedici","diciassette","diciotto","diciannove","venti"};
    String[] n2={"","vent","trent","quarant","cinquant","sessant","settant","ottant","novant"};
    String nn="";
    int v=0;
    public void Converti(int n){
        nn=""+n;
        v=n;
        if(n>=0 && n<=9999){
            if(nn.length()==1){
                System.out.println(n1[v]);
            }if(nn.length()==2){
                System.out.println(twoLength(n));
            }if(nn.length()==3){
               System.out.println(threeLength(n));                 
            }if(nn.length()==4){
               int p=Integer.parseInt((""+nn.charAt(1))+(""+nn.charAt(2))+(""+nn.charAt(3)));
               if((""+nn.charAt(0)).equals("1")){
                   System.out.println("mille"+threeLength(p));
                }else{
                   System.out.println(n1[Integer.parseInt((""+nn.charAt(0)))]+"mila"+threeLength(p)); 
                }
            }
        }else{System.out.println("Questo programma accetta solo numeri interi positivi da 0 a 9999.");}
    }
    private String threeLength(int n){
        String nn2=""+n;
        int p=Integer.parseInt((""+nn2.charAt(1))+(""+nn2.charAt(2)));
        if((""+nn2.charAt(0)).equals("1")){  
            return "cento"+twoLength(p);
        }else{
            return n1[Integer.parseInt((""+nn2.charAt(0)))]+"cento"+twoLength(p);  
        }   
    }
    private String twoLength(int n){
        String nn2=""+n;
        int t=Integer.parseInt(""+nn2.charAt(0));
            if(v<=20){
                return n1[v];
            }else{
                if((""+nn2.charAt(1)).equals("1") | (""+nn2.charAt(1)).equals("8")){
                    return n2[t-1]+n1[Integer.parseInt(""+nn2.charAt(1))];   
                }else{
                    if((""+nn2.charAt(0)).equals("2")){
                        return n2[t-1]+"i"+n1[Integer.parseInt(""+nn2.charAt(1))];
                    }else{
                        return n2[t-1]+"a"+n1[Integer.parseInt(""+nn2.charAt(1))];
                    }
                }
           }   
    }  
}

[ot]esercizio dato da un prof qualche anno fa,era per me impossibile farlo perchè non avevo le giuste conoscenze e non ero pratico con la programmazione di questo tipo :D![/ot]
 
Mazza, non è semplice.. Fino ad ora in PHP sono arrivato alle centinaia (lo faccio fino a 999), ma che casino che sono!

Ecco lo script in PHP, supporta numeri fino al 999, ma sto progettando di farlo fino al 9999:
PHP:
<?php
$num = $_GET['num'];
if (!is_numeric($num) or !$num or $num <= 0) {die('Inserisci un numero valido');}
if ($num > 999){die('Mi spiace, ma al momento lo script supporta solo numeri fino al 999 :-(');}
$base=explode(" ",'uno due tre quattro cinque sei sette otto nove dieci undici dodici tredici quattordici quindici sedici diciassette diciotto diciannove');
$dec=explode(" ",'venti trenta quaranta cinquanta sessanta settanta ottanta novanta');
$cen=explode(" ",'cento duecento trecento quattrocento cinquecento seicento settecento ottocento novecento');
$tmp = $num-1;
$tmparray = str_split($num,1);
ob_start();
if ($num <= 19) {
	echo $base[$tmp];
} elseif ($num >= 20 and $num < 100) {
	if (@$num[1] and $num[1] == 1) {
		$sec = (int) $tmparray[0] - 2;
		$sec = round($sec);
		echo substr($dec[$sec],0,strlen($dec[$sec])-1).$base[0];
	} else {
		$sec = (int) $tmparray[0] - 2;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $dec[$sec];
		$tem = $base[$tmparray[1]-1];
		$tem = ($tem and (int)$num[1]!=0) ? $tem : '';
		echo $sec.$tem;
	}
} elseif ($num >= 100) {
	if ($num[1] == 0) {
		$sec = (int) $tmparray[0] - 1;
		$sec = round($sec);
		$sec = $cen[$sec];
		$tem = @$base[$tmparray[2]-1];
		$tem = ($tem and (int)$num[2]!=0) ? $tem : '';
		echo $sec.$tem;
	} elseif($num[1] > 0) {
		$centinaia = $cen[round((int)$tmparray[0]-1)];
		if ($num[1].$num[2] < 20) {
			$decine_tmp = $num[1].$num[2];
			$decine_tmp = $decine_tmp - 1;
			echo $centinaia.$base[$decine_tmp];
		} else {
			if ($num[2] == 1) {
				$decine_tmp = $num[1] - 2;
				echo $centinaia.substr($dec[$decine_tmp],0,strlen($dec[$decine_tmp])-1).$base[$num[2]-1];
			} else {
				$decine_tmp = $num[1] - 2;
				echo $centinaia.$dec[$decine_tmp].$base[$num[2]-1];
			}
		}
		#echo $centinaia.$decine;
		
	}
}
$end=ob_get_contents();
ob_end_clean();
echo 'Il numero scritto in lettere &egrave;: '.$end;
?>
 
Python, fino a 99:
Codice:
from sys import argv
num = int(argv[1])
cifre = len(argv[1].strip())
a1 = ['', 'uno', 'due', 'tre', 'quattro', 'cinque', 'sei', 'sette', 'otto', 'nove', 'dieci', 'undici', 'dodici', 'tredici', 'quattordici', 'quindici', 'sedici', 'diciassette', 'diciotto', 'diciannove', 'venti']
a2 = ['', 'vent', 'trent', 'quarant', 'cinquant', 'sessant', 'settant', 'ottant', 'novant']
s = ['', 'i', 'a', 'a', 'a', 'a', 'a', 'a', 'a']

if (num<=20): print a1[num]
elif (argv[1][1:2]=='1'): print a2[int(argv[1][0:1])-1]+a1[int(argv[1][1:2])]
else: print a2[int(argv[1][0:1])-1]+s[int(argv[1][0:1])-1]+a1[int(argv[1][1:2])]
Se ho tempo lo continuo fino alle centinaia, non è complesso.

EDIT: Ecco:
Codice:
from sys import argv
num = int(argv[1])
cifre = len(argv[1].strip())
a1 = ['', 'uno', 'due', 'tre', 'quattro', 'cinque', 'sei', 'sette', 'otto', 'nove', 'dieci', 'undici', 'dodici', 'tredici', 'quattordici', 'quindici', 'sedici', 'diciassette', 'diciotto', 'diciannove', 'venti']
a2 = ['', 'vent', 'trent', 'quarant', 'cinquant', 'sessant', 'settant', 'ottant', 'novant']
s = ['', 'i', 'a', 'a', 'a', 'a', 'a', 'a', 'a']


if (num>99):
	cent = 'cento' if (argv[1][0:1]=='1') else a1[int(argv[1][0:1])]+'cento'
	if ((argv[1][2:3]=='1')or(argv[1][2:3]=='8')): print cent+a2[int(argv[1][1:2])-1]+a1[int(argv[1][2:3])]
	else: print cent+a2[int(argv[1][1:2])-1]+s[int(argv[1][1:2])-1]+a1[int(argv[1][2:3])]
else:
	if (num<=20): print a1[num]
	elif ((argv[1][1:2]=='1')or(argv[1][1:2]=='8')): print a2[int(argv[1][0:1])-1]+a1[int(argv[1][1:2])]
	else: print a2[int(argv[1][0:1])-1]+s[int(argv[1][0:1])-1]+a1[int(argv[1][1:2])]

EDIT2: Ho appena scoperto che non funziona sempre bene, ad esempio da "ventiotto".
Dovrei gestire la ventina che è più complessa, ma non mi va ora.. :$
EDIT3: Fixed.
 
sydarex ha detto:
EDIT2: Ho appena scoperto che non funziona sempre bene, ad esempio da "ventiotto".
Dovrei gestire la ventina che è più complessa, ma non mi va ora.. :$
:asd: Il mio script pensa anche a questo.. a breve la versione fino al 9999
 
[Python]
Codice:
#!/usr/bin/python
n1=("zero","uno","due","tre","quattro","cinque","sei","sette","otto","nove")
n2=("dieci","undici","dodici","tredici","quattordici","quindici","sedici","diciassette","diciotto","diciannove","venti")
n3=("", "", "venti","trenta","quaranta","cinquanta","sessanta","settanta","ottanta","novanta")
num=int(raw_input("Inserisci il numero: "))
num=str(num)
num.split()
name=[]
if len(num)==2:
    if int(num[0])==1:
        name.append(n2[int(num[1])])
    else:
        name.append(n3[int(num[0])])
        name.append(n1[int(num[1])])
    print ''.join(name)
elif len(num)==1:
    name.append(n1[int(num[0])])
    print ''.join(name)
else:
    print "Numero troppo lungo"
 
Finito! Ecco lo script fino al 9999:
PHP:
<?php
$num = $_GET['num'];
if (!is_numeric($num) or !$num or $num <= 0) {die('Inserisci un numero valido');}
if ($num > 9999){die('Mi spiace, ma al momento lo script supporta solo numeri fino al 9999 :-(');}
$base=explode(" ",'uno due tre quattro cinque sei sette otto nove dieci undici dodici tredici quattordici quindici sedici diciassette diciotto diciannove');
$dec=explode(" ",'venti trenta quaranta cinquanta sessanta settanta ottanta novanta');
$cen=explode(" ",'cento duecento trecento quattrocento cinquecento seicento settecento ottocento novecento');
$mig=explode(" ",'mille duemila tremila quattromila cinquemila seimila settemila ottomila novemila');
$tmp = $num-1;
$tmparray = str_split($num,1);
ob_start();
if ($num <= 19) {
	echo $base[$tmp];
} elseif ($num >= 20 and $num < 100 and $num < 1000) {
	if (@$num[1] and $num[1] == 1 or $num[1] == 8) {
		$sec = (int) $tmparray[0] - 2;
		$sec = round($sec);
		echo substr($dec[$sec],0,strlen($dec[$sec])-1).$base[$num[1]-1];
	} else {
		$sec = (int) $tmparray[0] - 2;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $dec[$sec];
		$tem = $base[$tmparray[1]-1];
		$tem = ($tem and (int)$num[1]!=0) ? $tem : '';
		echo $sec.$tem;
	}
} elseif ($num >= 100 and $num < 1000) {
	if ($num[1] == 0) {
		$sec = (int) $tmparray[0] - 1;
		$sec = round($sec);
		$sec = $cen[$sec];
		$tem = @$base[$tmparray[2]-1];
		$tem = ($tem and (int)$num[2]!=0) ? $tem : '';
		echo $sec.$tem;
	} elseif($num[1] > 0) {
		$centinaia = $cen[round((int)$tmparray[0]-1)];
		if ($num[1].$num[2] < 20) {
			$decine_tmp = $num[1].$num[2];
			$decine_tmp = $decine_tmp - 1;
			echo $centinaia.$base[$decine_tmp];
		} else {
			if ($num[2] == 1 or $num[2] == 8) {
				$decine_tmp = $num[1] - 2;
				echo $centinaia.substr($dec[$decine_tmp],0,strlen($dec[$decine_tmp])-1).$base[$num[2]-1];
			} else {
				$decine_tmp = $num[1] - 2;
				echo $centinaia.$dec[$decine_tmp].$base[$num[2]-1];
			}
		}
	}
} elseif ($num >= 1000) { // Sarà una fatica XD
	if ($num[1] == 0 and $num[2] == 0) {
		$sec = (int) $tmparray[0] - 1;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $mig[$sec];
		$tem = $base[$tmparray[3]-1];
		$tem = ($tem and (int)$num[3]!=0) ? $tem : '';
		echo $sec.$tem;
	} elseif ($num[1] == 0 and $num[2] > 0 and $num[2] < 2) {
		$sec = (int) $tmparray[0] - 1;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $mig[$sec];
		$temp = ($tmparray[2]).($tmparray[3]);
		$temp = round($temp);
		$tem = $base[$temp-1];
		echo $sec.$tem;
	} elseif ($num[1] == 0 and $num[2] >= 2) {
		$sec = (int) $tmparray[0] - 1;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $mig[$sec];
		$temp = $tmparray[2];
		$temp = round($temp);
		if ($num[3] == 8 or $num[3] == 1) {
			$tem = substr($dec[$temp-2],0,strlen($dec[$temp-2])-1);
		} else {
			$tem = $dec[$temp-2];
		}
		$ok=$base[$tmparray[3]-1];
		echo $sec.$tem.$ok;
	} elseif ($num[1] > 0 and $num[2].$num[3] < 20) {
		$migliaia = (int) $tmparray[0] - 1;
		$migliaia = ($migliaia < 0) ? 0 : $migliaia;
		$migliaia =$mig[$migliaia];
		$centinaia=(int) $tmparray[1]-1;
		$centinaia=($centinaia < 0) ? 0 : $centinaia;
		$centinaia=$cen[$centinaia];
		$unita=($num[2]) . ($num[3]);
		$unita = $unita-1;
		$unita=($unita < 0) ? 0 : $unita;
		$unita=$base[$unita];
		echo $migliaia.$centinaia.$unita;
	} elseif ($num[1] > 0 and $num[2] >= 2) {
		$migliaia = (int) $tmparray[0] - 1;
		$migliaia = ($migliaia < 0) ? 0 : $migliaia;
		$migliaia =$mig[$migliaia];
		$centinaia=(int) $tmparray[1]-1;
		$centinaia=($centinaia < 0) ? 0 : $centinaia;
		$centinaia=$cen[$centinaia];
		$decine=(int) $tmparray[2]-2;
		$decine=($decine < 0) ? 0 : $decine;
		$decine = $dec[$decine];
		$unita=(int) $tmparray[3]-1;
		$unita=($unita < 0) ? 0 : $unita;
		$unita=$base[$unita];
		$decine=((int) $tmparray[3] == 8 or (int) $tmparray[3] == 1) ? substr($decine,0,strlen($decine)-1) : $decine;
		echo $migliaia.$centinaia.$decine.$unita;
	}
}
$end=ob_get_contents();
ob_end_clean();
echo 'Il numero scritto in lettere &egrave;: '.$end;
?>
Bye
 
Visto il topic ne approfitto per postare questo:
Codice:
Function nomecifra(c As Double) As String
Select Case c
        Case 0
            nomecifra = "zero"
        Case 1
            nomecifra = "uno"
        Case 2
            nomecifra = "due"
        Case 3
            nomecifra = "tre"
        Case 4
            nomecifra = "quattro"
        Case 5
            nomecifra = "cinque"
        Case 6
            nomecifra = "sei"
        Case 7
            nomecifra = "sette"
        Case 8
            nomecifra = "otto"
        Case 9
            nomecifra = "nove"
        Case 10
            nomecifra = "dieci"
        Case 11
            nomecifra = "undici"
        Case 12
            nomecifra = "dodici"
        Case 13
            nomecifra = "tredici"
        Case 14
            nomecifra = "quattordici"
        Case 15
            nomecifra = "quindici"
        Case 16
            nomecifra = "sedici"
        Case 17
            nomecifra = "diciassette"
        Case 18
            nomecifra = "diciotto"
        Case 19
            nomecifra = "diciannove"
        
        Case Else    ' Altri valori.
            nomecifra = "ERRORE!!!"
End Select
End Function

Function nomedecina(c As Double) As String
Select Case c
       
        Case 20
            nomedecina = "venti"
        Case 30
            nomedecina = "trenta"
        Case 40
            nomedecina = "quaranta"
        Case 50
            nomedecina = "cinquanta"
        Case 60
            nomedecina = "sessanta"
        Case 70
            nomedecina = "settanta"
        Case 80
            nomedecina = "ottanta"
        Case 90
            nomedecina = "novanta"
        Case 100
            nomedecina = "cento"
        Case Else    ' Altri valori.
            nomedecina = "ERRORE!!!"
End Select
End Function

Function nomedecin(c As Double, unita As Integer) As String
If unita = 1 Or unita = 8 Then
Select Case c
       
        Case 20
            nomedecin = "vent"
        Case 30
            nomedecin = "trent"
        Case 40
            nomedecin = "quarant"
        Case 50
            nomedecin = "cinquant"
        Case 60
            nomedecin = "sessant"
        Case 70
            nomedecin = "settant"
        Case 80
            nomedecin = "ottant"
        Case 90
            nomedecin = "novant"
        Case 100
            nomedecin = "cento"
        Case Else    ' Altri valori.
            nomedecin = "ERRORE!!!"
End Select
Else
    nomedecin = nomedecina(c)
End If
End Function

Function NumeroInLettere(N As Double) As String
Dim NumInt As Double
NumInt = Int(N)
Select Case NumInt
     Case Is < 20
       NumeroInLettere = nomecifra(NumInt)
    Case Is < 101
       If (Round(NumInt / 10) * 10) = NumInt Then
            NumeroInLettere = nomedecina(NumInt)
        Else
            NumeroInLettere = nomedecin(Round((NumInt - 5) / 10) * 10, NumInt - Round((NumInt - 5) / 10, 0) * 10) & NumeroInLettere(NumInt - Round((NumInt - 5) / 10, 0) * 10)
        End If
    Case Is < 200
        NumeroInLettere = "cento" & NumeroInLettere(NumInt - 100)
    Case Is < 1000
        If Round(NumInt / 100) * 100 = NumInt Then
            NumeroInLettere = NumeroInLettere(NumInt / 100) & "cento"
        Else
            NumeroInLettere = NumeroInLettere(Round((NumInt - 50) / 100)) & "cento" & NumeroInLettere(NumInt - Round((NumInt - 50) / 100) * 100)
        End If
    Case 1000
        NumeroInLettere = "mille"
    Case Is < 2000
        NumeroInLettere = "mille" & NumeroInLettere(NumInt - 1000)
    Case Is < 1000000
        If Round(NumInt / 1000) * 1000 = NumInt Then
            NumeroInLettere = NumeroInLettere(NumInt / 1000) & "mila"
        Else
            NumeroInLettere = NumeroInLettere(Round((NumInt - 500) / 1000)) & "mila" & NumeroInLettere(NumInt - Round((NumInt - 500) / 1000) * 1000)
        End If
    Case 1000000
        NumeroInLettere = "unmilione"
    Case Is < 2000000
        NumeroInLettere = "unmilione" & NumeroInLettere(NumInt - Round((NumInt - 500000) / 1000000) * 1000000)
    Case Is < 1000000000
        If Round(NumInt / 1000000) * 1000000 = NumInt Then
            NumeroInLettere = NumeroInLettere(NumInt / 1000000) & "milioni"
        Else
            NumeroInLettere = NumeroInLettere(Round((NumInt - 500000) / 1000000)) & "milioni" & NumeroInLettere(NumInt - Round((NumInt - 500000) / 1000000) * 1000000)
        End If
    Case 1000000000
        NumeroInLettere = "unmiliardo"
    Case Is < 2000000000
        NumeroInLettere = "unmiliardo" & NumeroInLettere(NumInt - Round((NumInt - 500000) / 1000000) * 1000000)
    Case Is < 1E+15
        If Round(NumInt / 1000000000) * 1000000000 = NumInt Then
            NumeroInLettere = NumeroInLettere(NumInt / 1000000000) & "miliardi"
        Else
            NumeroInLettere = NumeroInLettere(Round((NumInt - 500000000) / 1000000000)) & "miliardi" & NumeroInLettere(NumInt - Round((NumInt - 500000000) / 1000000000) * 1000000000)
        End If
End Select
End Function

Function valoreinlettere(N As Double) As String
Dim NumInt As Double
Dim a As Integer
Dim centesimi As String

a = Round((N - Round(N)) * 100)
If a < 0 Then a = a + 100
If a < 10 Then
    centesimi = "0" & Trim(Str(a))
Else
    centesimi = Trim(Str(a))
End If
NumInt = Int(N)
valoreinlettere = NumeroInLettere(NumInt) & "/" & centesimi
End Function
è in VBA ed è utilissimo per chi utilizza excel; non è mio e non ricordo chi l'abbia scritto, so solo che sono impazzito per trovarlo quindi voglio condividerlo... :)
 
Ecco il mio script aggiornato, che aveva un bug (mostrava un errore se mettevi un numero con lo zero alla fine):
PHP:
<?php
error_reporting(E_ERROR); // Mostra SOLO errori gravi. Commenta questa riga per visualizzare anche gli errori di tipo notice o fare il debug.
$num = $_GET['num'];
if (!is_numeric($num) or !$num or $num <= 0) {die('Inserisci un numero valido');}
if ($num > 9999){die('Mi spiace, ma al momento lo script supporta solo numeri fino al 9999 :-(');}
$base=explode(" ",'uno due tre quattro cinque sei sette otto nove dieci undici dodici tredici quattordici quindici sedici diciassette diciotto diciannove');
$dec=explode(" ",'venti trenta quaranta cinquanta sessanta settanta ottanta novanta');
$cen=explode(" ",'cento duecento trecento quattrocento cinquecento seicento settecento ottocento novecento');
$mig=explode(" ",'mille duemila tremila quattromila cinquemila seimila settemila ottomila novemila');
$tmp = $num-1;
$tmparray = str_split($num,1);
ob_start();
if ($num <= 19) {
	echo $base[$tmp];
} elseif ($num >= 20 and $num < 100 and $num < 1000) {
	if (@$num[1] and $num[1] == 1 or $num[1] == 8) {
		$sec = (int) $tmparray[0] - 2;
		$sec = round($sec);
		echo substr($dec[$sec],0,strlen($dec[$sec])-1).$base[$num[1]-1];
	} else {
		$sec = (int) $tmparray[0] - 2;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $dec[$sec];
		$tem = $base[$tmparray[1]-1];
		$tem = ($tem and (int)$num[1]!=0) ? $tem : '';
		echo $sec.$tem;
	}
} elseif ($num >= 100 and $num < 1000) {
	if ($num[1] == 0) {
		$sec = (int) $tmparray[0] - 1;
		$sec = round($sec);
		$sec = $cen[$sec];
		$tem = @$base[$tmparray[2]-1];
		$tem = ($tem and (int)$num[2]!=0) ? $tem : '';
		echo $sec.$tem;
	} elseif($num[1] > 0) {
		$centinaia = $cen[round((int)$tmparray[0]-1)];
		if ($num[1].$num[2] < 20) {
			$decine_tmp = $num[1].$num[2];
			$decine_tmp = $decine_tmp - 1;
			echo $centinaia.$base[$decine_tmp];
		} else {
			if ($num[2] == 1 or $num[2] == 8) {
				$decine_tmp = $num[1] - 2;
				echo $centinaia.substr($dec[$decine_tmp],0,strlen($dec[$decine_tmp])-1).$base[$num[2]-1];
			} else {
				$decine_tmp = $num[1] - 2;
				echo $centinaia.$dec[$decine_tmp].$base[$num[2]-1];
			}
		}
	}
} elseif ($num >= 1000) { // Sarà una fatica XD
	if ($num[1] == 0 and $num[2] == 0) {
		$sec = (int) $tmparray[0] - 1;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $mig[$sec];
		$tem = $base[$tmparray[3]-1];
		$tem = ($tem and (int)$num[3]!=0) ? $tem : '';
		echo $sec.$tem;
	} elseif ($num[1] == 0 and $num[2] > 0 and $num[2] < 2) {
		$sec = (int) $tmparray[0] - 1;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $mig[$sec];
		$temp = ($tmparray[2]).($tmparray[3]);
		$temp = round($temp);
		$tem = $base[$temp-1];
		echo $sec.$tem;
	} elseif ($num[1] == 0 and $num[2] >= 2) {
		$sec = (int) $tmparray[0] - 1;
		$sec = ($sec < 0) ? 0 : $sec;
		$sec = $mig[$sec];
		$temp = $tmparray[2];
		$temp = round($temp);
		if ($num[3] == 8 or $num[3] == 1) {
			$tem = substr($dec[$temp-2],0,strlen($dec[$temp-2])-1);
		} else {
			$tem = $dec[$temp-2];
		}
		$ok=$base[$tmparray[3]-1];
		echo $sec.$tem.$ok;
	} elseif ($num[1] > 0 and $num[2].$num[3] < 20) {
		$migliaia = (int) $tmparray[0] - 1;
		$migliaia = ($migliaia < 0) ? 0 : $migliaia;
		$migliaia =$mig[$migliaia];
		$centinaia=(int) $tmparray[1]-1;
		$centinaia=($centinaia < 0) ? 0 : $centinaia;
		$centinaia=$cen[$centinaia];
		$unita=($num[2]) . ($num[3]);
		$unita = $unita-1;
		$unita=($unita < 0) ? 0 : $unita;
		$unita=$base[$unita];
		echo $migliaia.$centinaia.$unita;
	} elseif ($num[1] > 0 and $num[2] >= 2) {
		$migliaia = (int) $tmparray[0] - 1;
		$migliaia = ($migliaia < 0) ? 0 : $migliaia;
		$migliaia =$mig[$migliaia];
		$centinaia=(int) $tmparray[1]-1;
		$centinaia=($centinaia < 0) ? 0 : $centinaia;
		$centinaia=$cen[$centinaia];
		$decine=(int) $tmparray[2]-2;
		$decine=($decine < 0) ? 0 : $decine;
		$decine = $dec[$decine];
		$unita=(int) $tmparray[3]-1;
		$unita=($unita < 0) ? 0 : $unita;
		$unita=$base[$unita];
		$decine=((int) $tmparray[3] == 8 or (int) $tmparray[3] == 1) ? substr($decine,0,strlen($decine)-1) : $decine;
		echo $migliaia.$centinaia.$decine.$unita;
	}
}
$end=ob_get_contents();
ob_end_clean();
echo 'Il numero scritto in lettere &egrave;: '.$end;
?>
Ciao
 
bene ragazzi io sono al lavoro ma sapete mi sto dedicando molto al libro book of infernet
che entro 4-5 giorni ho finito
[ot]
- VIRUS
- Social Engineer
.dos/ddos
[/ot]
 
Io ne ho realizzato uno in C++ che va da 0 a 9.999.999.999

Codice:
#include <iostream>
#include <string>


std::string _0_19[] = {"", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", 
                       "otto", "nove", "dieci", "undici", "dodici", "tredici", "quattordici", 
                       "quindici", "sedici", "diciassette", "diciotto", "diciannove"}; 

std::string _20_90[] = {"", "", "venti", "trenta", "quaranta", "cinquanta", 
                        "sessanta", "settanta", "ottanta", "novanta"};



std::string Num2Let(std::string num, int len) {

            std::string str;
            
            if (num == "0")
               return "zero";
            else                      
            if (num.size() == 1) 
               return _0_19[num[0] - 48];
            else  
            if (num.size() == 2) {
               if (num[0] == '1')
                  str = _0_19[10 + num[1] - 48];
               else {
                    if (num[1] == '1' || num[1] == '8')
                       str = _20_90[num[0] - 48].substr(0, _20_90[num[0] - 48].size() - 1);
                    else
                       str = _20_90[num[0] - 48];
                    str += _0_19[num[1] - 48];
               };
               return str;
            }
            else
            if (num.size() == 3) {
               if (num[0] == '0')
                  return str + Num2Let(num.substr(1), len - 1);
               if (num[0] != '1')
                  str = _0_19[num[0] - 48];
               str += "cento";
               if (num[1] == '8')
                  str = str.substr(0, str.size() - 1);
              return str + Num2Let(num.substr(1), len - 1);
            }
            else
            if (num.size() == 4) {
               if (num[0] == '0')
                  return str + Num2Let(num.substr(1), len - 1);
               str = num[0] == '1' ? "mille" : _0_19[num[0] - 48] + "mila";
               if (num[1] == '0')
                  return str + Num2Let(num.substr(2), len - 2);
               return str + Num2Let(num.substr(1), len - 1);
            }
            else
            if (num.size() == 5) {
               if (num[0] == '0')
                  return str + Num2Let(num.substr(1), len - 1);
               if (num[0] == '1')
                  str = _0_19[10 + num[1] - 48];
               else {
                    if (num[1] == '1' || num[1] == '8')
                       str = _20_90[num[0] - 48].substr(0, _20_90[num[0] - 48].size() - 1);
                    else
                       str = _20_90[num[0] - 48];
                    str += _0_19[num[1] - 48];
               };
               return str + "mila" +  Num2Let(num.substr(2), len - 2);
            }
            else
            if (num.size() == 6) {
               if (num[0] == '0')
                  return str + Num2Let(num.substr(1), len - 1);
               if (num[0] != '1')
                  str = _0_19[num[0] - 48];
               str += "cento";
               if (num[1] == '8')
                  str = str.substr(0, str.size() - 1);
               return str + Num2Let(num.substr(1), len - 1);
            }
            else
            if (num.size() == 7) {
               if (num[0] == '1')
                  str = "unmilione";
               else
                   str = _0_19[num[0] - 48] + "milioni";
               return str + Num2Let(num.substr(1), len - 1);
            }
            else
            if (num.size() == 8) {
               if (num[0] == '1')
                  str = _0_19[10 + num[1] - 48];
               else {
                    if (num[1] == '1' || num[1] == '8')
                       str = _20_90[num[0] - 48].substr(0, _20_90[num[0] - 48].size() - 1);
                    else
                       str = _20_90[num[0] - 48];
                    str += _0_19[num[1] - 48];
               };
               return str + "milioni" + Num2Let(num.substr(2), len - 2);                       
            }
            else
            if (num.size() == 9) {
               if (num[0] != '1')
                  str = _0_19[num[0] - 48];
               str += "cento";
               if (num[1] == '8')
                  str = str.substr(0, str.size() - 1);
              return str + Num2Let(num.substr(1), len - 1);
            }
            else
            if (num.size() == 10) {
               if (num[0] == '1')
                  str = "unmiliardo";
               else
                   str = _0_19[num[0] - 48] + "miliardi";
               return str + Num2Let(num.substr(1), len - 1);
            };
            
};


int main () {
        std::string n;
        
        while (true) {
            std::cout << "Inserisci un numero da 0 a 9999999999 (e per uscire)" << std::endl;
            std::cin >> n;
            if (n == "e")
               break;
            std::cout << Num2Let(n, n.size()) << "\n" << std::endl;
        };
        
        return 0;
}
 
Si, verificatelo, l'ho scritto stamattina, ma credo sia giusto.

Inoltre, ci sono piccole differenze da gestire man mano che il programma supporta un numero più alto, non è vero che basta arrivare a 9999 e il resto è uguale, almeno nel codice che ho scritto io.

Ciao
 
Stato
Discussione chiusa ad ulteriori risposte.