Newsgroup: it.comp.www.php
Titolo: [PHPigrizia] Funzione che converta da euro in lettere...

Avete per caso in giro una funzioncina che converta una cifra in euro in
lettere... come negli assegni per capirci...
1,00 --> uno/00
10,15 --> dieci/15
1221,42 --> milleduecentoventuno/42
Vabbé .. ho capito.. la scrivo.. :)


rendila pubblica poi :D



Oh, avevo fatto qualcosa in applesoft, ma non so dove trovare un lettore di
floppy da 5 1/4...
Comunque Google dice di guardare qui:
http://www.php.net/manual/en/function.number-format.php
C'e' un esempio in anglico, ma almeno ti basta tradurlo.
Tanto per curiosita', non ci sarebbe un posto dove archiviare tutti
questi pezzetti di codice tanto comodi che non si trovano mai?
A parte PHPBuilder e i soliti siti...
-- 
Marco Bernardini
bernama chiocciola libero it

 lettere... come negli assegni per capirci...
Tempo fa avevo trovato una bellissima funzione di Roal Zanassi, tra l'altro
multilingue; mi sembra sul sito comune dei programmatori di Access.
Con una brevissima ricerca si troverebbe e dovrebbe essere facile
convertirla in php.
Bye
	gpb
-- 
http://gpbizzaro.supereva.it/index.html
(Cartesio aggiornato il 17 maggio 2002)

 C'e' un esempio in anglico, ma almeno ti basta tradurlo.
beh.. avevo notato ma tradurlo non basta.. per questioni linguistiche in
italiano ci sono un po' di casi particolari..
Ad esempio un 28..  in inglese twenty eight...  in italiano non venti otto
ma ventotto... tutte le decine con unità 1 (21 31 41 ecc ecc)
Comunque ho vinto la pigrizia ed è quasi finita.. non sarà il massimo a
livello di leggibilità e di ordine ma pare funzioni correttamente..


wrote:

In C:
const char *unita(int numero)
{
        const char *__u[]=      {"", "uno", "due", "tre",
                        "quattro",
                        "cinque", "sei", "sette", "otto",
                        "nove", "dieci", "undici", "dodici",
                        "tredici",
                        "quattordici", "quindici",
                        "sedici",
                        "diciassette", "diciotto",
                        "diciannove" };
        return __u[numero > 20 ? numero % 10 : numero];
}
const char *decine(int numero)
{
        const char *__d[]=      { "", "", "venti", "trenta",
                        "quaranta",
                        "cinquanta", "sessanta", "settanta", "ottanta",
                        "novanta" };
        return __d[(numero % 100) / 10];
}
char *centinaia(int numero)
{
        static char     centin[32];
        int             n;
        n = numero / 100;
        if (n == 0)
                *centin = 0;
        else
                snprintf(centin, sizeof(centin), "%scento", n < 2 ? "" :
unita(n
));
        return centin;
}
const char *migliaia( int numero, int livello )
{
        const char      *__m1[] = { "uno", "mille", "un milione", "un
miliardo"
};
        const char      *__m[] = { "", "mila", " milioni", " miliardi"
};
        if (1 == numero)
                return __m1[livello];
        return __m[livello];
}
char *textnumerize(long number)
{
        static char     testo[256];
        long            divider;
        int             i, minus = 0, unit = 0;
        if (number < 0)
        {
                number  = -number;
                minus   = 1;
        }
        *testo = 0;
        if (0 == number)
        {
                strncpy(testo, "zero", sizeof(testo));
                return testo;
        }
        for(divider=number; divider; divider/=10)
                unit++;
        unit/=3;
        unit++;
        divider = 1;
        for (i=1; i < unit; i++)
                divider *= 1000;
        printf("Divider: %ld\n", divider);
        while(number)
        {
                int numero;
                numero = number / divider;
                number = number % divider;
                divider/= 1000;
                unit--;
                if (0 == numero)
                        continue;
                if (1 == numero)
                        strncat(testo, migliaia(1, unit),
sizeof(testo));
                else
                {
                        strncat(testo, centinaia(numero),
sizeof(testo));
                        if ((numero % 100)/10 == 8)
                                testo[strlen(testo)-1] = 0;
                        strncat(testo, decine(numero), sizeof(testo));
                        if ((numero % 10 == 1) || (numero % 10 == 8))
                                testo[strlen(testo)-1] = 0;
                        strncat(testo, unita(numero), sizeof(testo));
                        strncat(testo, migliaia(numero, unit),
sizeof(testo));
                }
                if (number)
                        strncat(testo, " ", sizeof(testo));
        }
        if (minus)
        {
                char    swapo[256];
                snprintf(swapo, sizeof(swapo), "meno %s", testo);
                strncpy(testo, swapo, sizeof(testo));
        }
        return testo;
}
#ifndef NO_STANDALONE
int main(int argc, char **argv)
{
        return (argc!=2 ? EXIT_FAILURE : printf("%s\n",
textnumerize(atol(argv[1
]))));
}
#endif
Leonardo