Ho provato ad aggiungere un controllo, affinchè nel caso le unita siano pari a 1 o a 8 mi venga scritto ventuno,trentuno al posto di ventiuno, trentauno ecc.
Codice PHP:
<?php
function numero_lettere($numero)
{
if (($numero < 0) || ($numero > 999999999))
{
return "$numero";
}
$milioni = floor($numero / 1000000); // Milioni
$numero -= $milioni * 1000000;
$migliaia = floor($numero / 1000); // Migliaia
$numero -= $migliaia * 1000;
$centinaia = floor($numero / 100); // Centinaia
$numero -= $centinaia * 100;
$decine = floor($numero / 10); // Decine
$unita = $numero % 10; // Unità
$cifra_lettere = "";
if ($milioni)
{
if ($milioni == 1)
$cifra_lettere .= numero_lettere($milioni) . "milione ";
else
$cifra_lettere .= numero_lettere($milioni) . "milioni ";
}
if ($migliaia)
{
if ($migliaia == 1)
$cifra_lettere .= numero_lettere($migliaia) . "mille ";
else
$cifra_lettere .= numero_lettere($migliaia) . "mila ";
}
if ($centinaia)
{
$cifra_lettere .= numero_lettere($centinaia) . "cento ";
}
$array_primi = array("", "uno", "due", "tre", "quattro", "cinque", "sei",
"sette", "otto", "nove", "dieci", "undici", "dodici", "tredici",
"quattordici", "quindici", "sedici", "diciassette", "diciotto",
"diciannove");
$array_decine = array("", "", "venti", "trenta", "quaranta", "cinquanta", "sessanta",
"settanta", "ottanta", "novanta");
$array_decine_tronc = array("", "", "vent", "trent", "quarant", "cinquant", "sessant",
"settant", "ottant", "novant");
if ($decine || $unita)
{
if ($decine < 2)
{
$cifra_lettere .= $array_primi[$decine * 10 + $unita];
}
else
{
if ($unita == 1 || $unita == 8)
$cifra_lettere .= $array_decine_tronc[$decine];
else
$cifra_lettere .= $array_decine[$decine];
if ($unita)
{
$cifra_lettere .= $array_primi[$unita];
}
}
}
if (empty($cifra_lettere))
{
$cifra_lettere = "zero";
}
return $cifra_lettere;
}
$prezzo = 3161391;
$letterale = numero_lettere($prezzo);
if ( substr($letterale,-3) == 'uno')
$letterale = str_replace("uno","",$letterale).'uno';
echo $letterale;
// con substring tremilioni cento sessantmila trecento novantuno
// senza substring tremilioni unocento sessantunomila trecento novantuno
?>
Così facendo mi sono complicato ancora di più la vita. Come potete vedere dai commenti se vado ad applicare lo str_replace ottengo un output del tipo
tremilioni cento sessantmila trecento novantuno
A questo punto penso che l'unica soluzione sia un'espressione regolare sull'output della funzione. :master: