Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922

    prezzo in formato letterale. problema unità.

    Ciao a tutti. Avrei la necessità di rappresentare un numero in formato letterale.
    Grosso modo ci sono riuscito ma avrei bisogno del vostro aiuto per risolvere un piccolo problema.

    Supponiamo che io abbia un prezzo così:
    $prezzo = 2118101;
    la mia funzione mi restituisce
    duemilioni unocento diciottomila unocento uno
    mentre io vorrei
    duemilioni cento diciottomila cento uno

    La soluzione a cui ho pensato io è del tipo

    if ( substr($letterale,-3) == 'uno')
    $letterale = str_replace("uno","",$letterale).'uno';

    cioè rimuovere tutti gli uno dalla stringa, e, nel caso l'uno si riferisca all'unità finale, concatenarlo, ma vorrei sapere se è possibile all'interno della funzione implementare un controllo che faccia questo lavoro (anche perchè non avendo ancora fatto abbastanza prove non vorrei che col mio metodo ci fossero risultati imprevisti).

    Il mio codice è questo:
    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");

        if (
    $decine || $unita)
        {
            if (
    $decine 2)
            {
                
    $cifra_lettere .= $array_primi[$decine 10 $unita];
            }
            else
            {
                
    $cifra_lettere .= $array_decine[$decine];

                if (
    $unita)
                {
                    
    $cifra_lettere .= $array_primi[$unita];
                }
            }
        }

        if (empty(
    $cifra_lettere))
        {
            
    $cifra_lettere "zero";
        }

        return 
    $cifra_lettere;
    }

    $prezzo 2118101;
    $letterale numero_lettere($prezzo);
    if ( 
    substr($letterale,-3) == 'uno')
    $letterale str_replace("uno","",$letterale).'uno';
    echo 
    $letterale;
    ?>
    Grazie per ogni eventuale consiglio.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    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 == || $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:

  3. #3
    prova a modificare così dove controlli le centinaia, non applicando il substr in fondo:

    Codice PHP:
     if ($centinaia)
        {
        
    $tmp numero_lettere($centinaia);
        
    $cifra_lettere .= ($tmp=='uno') ? '' $tmp
            
    $cifra_lettere .= "cento ";
        } 
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da Anªkin
    prova a modificare così dove controlli le centinaia, non applicando il substr in fondo:

    Codice PHP:
     if ($centinaia)
        {
        
    $tmp numero_lettere($centinaia);
        
    $cifra_lettere .= ($tmp=='uno') ? '' $tmp
            
    $cifra_lettere .= "cento ";
        } 
    Grazie mille anakin. E' perfetto. Gentilissimo e risolutivo come sempre.

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Dovevo ancora applicare il controllo sull'uno ai milioni e alle migliaia. Questa dovrebbe essere la versione definitiva, nel caso possa servire a qualcuno. Grazie ancora anakin
    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)
        {
        
    $tmp numero_lettere($milioni);
        
    $cifra_lettere .= ($tmp=='uno') ? '' $tmp;
        
    $cifra_lettere .= ($milioni == '1') ? "un milione ":" milioni ";
        }

        if (
    $migliaia)
        {
        
    $tmp numero_lettere($migliaia);
        
    $cifra_lettere .= ($tmp=='uno') ? '' $tmp;
        
    $cifra_lettere .= ($migliaia == '1') ? "mille":"mila ";
        }

        if (
    $centinaia)
        {
        
    $tmp numero_lettere($centinaia);
        
    $cifra_lettere .= ($tmp=='uno') ? '' $tmp;
        
    $cifra_lettere .= "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 == || $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 1002111;

    $letterale numero_lettere($prezzo);
    echo 
    $letterale// un milione duemila centoundici 
    ?>

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Per la serie: le cose le trovi quando cerchi tutt'altro.

    Questa classe di chris è perfetta. L'avessi trovata prima.

    Per chi la volesse provare.
    http://www.phpclasses.org/browse/package/932.html

    Complimenti Andrea.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.