Italian [Risolto] Conversioni numeri in parole

Aldo's

Active Member
Licensed User
Scusate, qualcuno di voi ha già fatto una sub che trasforma una cifra numerica in parole? Es. 123 diventa centroventitre.
Se l'avete potete condividerla?
 

sirjo66

Well-Known Member
Licensed User
Longtime User
io ne ho una scritta taaaaaanti anni fa (credo almeno 20) che però è ancora valida, però è scritta in Visual Basic e non è ottimizzata, prova a vedere se riesci a convertirla in B4X sennò chiedi aiuto

B4X:
    Public Function Lettere(Importo As Double) As String
        Dim Ne(20) As String, De(10) As String, Mil(4) As String, Mila(4) As String
        Dim Ip As String, Vs As String
        Dim Qq As Integer, Sm As String, Ae As String, Af As String

        If Importo = 0 Then Return "ZERO"
        If Importo = 1 Then Return "UNO"

        Ip = ""
        Ne(1) = ""
        Ne(2) = "UNO"
        Ne(3) = "DUE"
        Ne(4) = "TRE"
        Ne(5) = "QUATTRO"
        Ne(6) = "CINQUE"
        Ne(7) = "SEI"
        Ne(8) = "SETTE"
        Ne(9) = "OTTO"
        Ne(10) = "NOVE"
        Ne(11) = "DIECI"
        Ne(12) = "UNDICI"
        Ne(13) = "DODICI"
        Ne(14) = "TREDICI"
        Ne(15) = "QUATTORDICI"
        Ne(16) = "QUINDICI"
        Ne(17) = "SEDICI"
        Ne(18) = "DICIASSETTE"
        Ne(19) = "DICIOTTO"
        Ne(20) = "DICIANNOVE"
        De(1) = ""
        De(2) = "DIECI"
        De(3) = "VENTI"
        De(4) = "TRENTA"
        De(5) = "QUARANTA"
        De(6) = "CINQUANTA"
        De(7) = "SESSANTA"
        De(8) = "SETTANTA"
        De(9) = "OTTANTA"
        De(10) = "NOVANTA"
        Mil(4) = "UNO"
        Mil(3) = "MILLE"
        Mil(2) = "UNMILIONE"
        Mil(1) = "UNMILIARDO"
        Mila(4) = ""
        Mila(3) = "MILA"
        Mila(2) = "MILIONI"
        Mila(1) = "MILIARDI"

        Vs = Importo.ToString("000000000000")

        For Qq = 1 To 4
            Sm = Vs.Substring(0, 3)
            If Qq < 4 Then Vs = Vs.Substring(3)
            If Integer.Parse(Sm) = 0 Then Continue For
            If Integer.Parse(Sm) = 1 Then
                Ip = Ip & Mil(Qq)
                Continue For
            End If
            If Integer.Parse(Sm) >= 100 Then
                Ae = Sm.Substring(0, 1)
                If Ae = "1" Then
                    Ip = Ip + "CENTO"
                Else
                    Ip = Ip & Ne(Integer.Parse(Ae) + 1) & "CENTO"
                End If
            End If
            Sm = Sm.Substring(1, 2)
            If Integer.Parse(Sm) < 20 Then
                Ip = Ip & Ne(Integer.Parse(Sm) + 1) & Mila(Qq)
                Continue For
            End If
            Ae = Sm.Substring(0, 1)
            Af = Sm.Substring(1, 1)
            Ip = Ip & De(Integer.Parse(Ae) + 1) & Ne(Integer.Parse(Af) + 1) & Mila(Qq)
        Next

        Return Ip

    End Function
 

LucaMs

Expert
Licensed User
Longtime User
(Ero curioso)

Tutto sommato è come averlo chiesto a uno straniero :p :

1704892534825.png


(Il "Certamente!" ce lo mette sempre; non sarà un po' presuntuoso? ? )
 

MarcoRome

Expert
Licensed User
Longtime User
:)

1704897684044.png



1704897730830.png


....... Lunga chiacchierata.......alla fine abbiamo trovato la quadra

1704897820518.png


B4X:
Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("Layout1")
    'MainForm.Show
    Log(NumeroInLettere(12))
    Log(NumeroInLettere(123))
    Log(NumeroInLettere(1234))
    Log(NumeroInLettere(34234))
    Log(NumeroInLettere(456780))
    Log(NumeroInLettere(5600789))
    Log(NumeroInLettere(68345000))
    Log(NumeroInLettere(789123567))
End Sub

Sub NumeroInLettere(num As Long) As String
    If num = 0 Then
        Return "zero"
    End If

    Dim parti() As String = Array As String("", "mila", "milioni", "miliardi")
    Dim risultato As String = ""
    Dim parteNumero As Long
    Dim indiceParte As Int = 0

    Do While num > 0
        parteNumero = num Mod 1000
        If parteNumero > 0 Then
            If indiceParte = 1 And parteNumero = 1 Then
                risultato = "mille" & risultato
            Else
                risultato = ConvertiCento(parteNumero) & parti(indiceParte) & risultato
            End If
        End If
        num = num / 1000
        indiceParte = indiceParte + 1
    Loop

    Return risultato.Trim
End Sub

Sub ConvertiCento(num As Int) As String
    Dim unita() As String = Array As String("", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove")
    Dim speciali() As String = Array As String("dieci", "undici", "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove")
    Dim decine() As String = Array As String("", "", "venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta")
    Dim centinaia() As String = Array As String("", "cento", "duecento", "trecento", "quattrocento", "cinquecento", "seicento", "settecento", "ottocento", "novecento")

    Dim nUnita As Int = num Mod 10
    Dim nDecine As Int = (num / 10) Mod 10
    Dim nCentinaia As Int = num / 100

    Dim risultato As String = ""

    risultato = centinaia(nCentinaia)

    If nDecine = 1 Then ' Numeri tra 10 e 19
        risultato = risultato & speciali(nUnita)
    Else
        risultato = risultato & decine(nDecine)
        If nUnita > 0 Then
            risultato = risultato & unita(nUnita)
        End If
    End If

    Return risultato
End Sub
 

MarcoRome

Expert
Licensed User
Longtime User
:)

View attachment 149523


View attachment 149524

....... Lunga chiacchierata.......alla fine abbiamo trovato la quadra

View attachment 149525

B4X:
Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("Layout1")
    'MainForm.Show
    Log(NumeroInLettere(12))
    Log(NumeroInLettere(123))
    Log(NumeroInLettere(1234))
    Log(NumeroInLettere(34234))
    Log(NumeroInLettere(456780))
    Log(NumeroInLettere(5600789))
    Log(NumeroInLettere(68345000))
    Log(NumeroInLettere(789123567))
End Sub

Sub NumeroInLettere(num As Long) As String
    If num = 0 Then
        Return "zero"
    End If

    Dim parti() As String = Array As String("", "mila", "milioni", "miliardi")
    Dim risultato As String = ""
    Dim parteNumero As Long
    Dim indiceParte As Int = 0

    Do While num > 0
        parteNumero = num Mod 1000
        If parteNumero > 0 Then
            If indiceParte = 1 And parteNumero = 1 Then
                risultato = "mille" & risultato
            Else
                risultato = ConvertiCento(parteNumero) & parti(indiceParte) & risultato
            End If
        End If
        num = num / 1000
        indiceParte = indiceParte + 1
    Loop

    Return risultato.Trim
End Sub

Sub ConvertiCento(num As Int) As String
    Dim unita() As String = Array As String("", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove")
    Dim speciali() As String = Array As String("dieci", "undici", "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove")
    Dim decine() As String = Array As String("", "", "venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta")
    Dim centinaia() As String = Array As String("", "cento", "duecento", "trecento", "quattrocento", "cinquecento", "seicento", "settecento", "ottocento", "novecento")

    Dim nUnita As Int = num Mod 10
    Dim nDecine As Int = (num / 10) Mod 10
    Dim nCentinaia As Int = num / 100

    Dim risultato As String = ""

    risultato = centinaia(nCentinaia)

    If nDecine = 1 Then ' Numeri tra 10 e 19
        risultato = risultato & speciali(nUnita)
    Else
        risultato = risultato & decine(nDecine)
        If nUnita > 0 Then
            risultato = risultato & unita(nUnita)
        End If
    End If

    Return risultato
End Sub

Tanto presuntuoso non è ... visto i risultati in pochi secondi ? ? ?
 

Sagenut

Expert
Licensed User
Longtime User
Tanto presuntuoso non è ... visto i risultati in pochi secondi ? ? ?
Il problema è che parte sempre con una supercazzola, poi gli dici che ha sbagliato e corregge.
Mai alla prima. ?
 

LucaMs

Expert
Licensed User
Longtime User
:)

View attachment 149523


View attachment 149524

....... Lunga chiacchierata.......alla fine abbiamo trovato la quadra

View attachment 149525

B4X:
Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    MainForm.RootPane.LoadLayout("Layout1")
    'MainForm.Show
    Log(NumeroInLettere(12))
    Log(NumeroInLettere(123))
    Log(NumeroInLettere(1234))
    Log(NumeroInLettere(34234))
    Log(NumeroInLettere(456780))
    Log(NumeroInLettere(5600789))
    Log(NumeroInLettere(68345000))
    Log(NumeroInLettere(789123567))
End Sub

Sub NumeroInLettere(num As Long) As String
    If num = 0 Then
        Return "zero"
    End If

    Dim parti() As String = Array As String("", "mila", "milioni", "miliardi")
    Dim risultato As String = ""
    Dim parteNumero As Long
    Dim indiceParte As Int = 0

    Do While num > 0
        parteNumero = num Mod 1000
        If parteNumero > 0 Then
            If indiceParte = 1 And parteNumero = 1 Then
                risultato = "mille" & risultato
            Else
                risultato = ConvertiCento(parteNumero) & parti(indiceParte) & risultato
            End If
        End If
        num = num / 1000
        indiceParte = indiceParte + 1
    Loop

    Return risultato.Trim
End Sub

Sub ConvertiCento(num As Int) As String
    Dim unita() As String = Array As String("", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove")
    Dim speciali() As String = Array As String("dieci", "undici", "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove")
    Dim decine() As String = Array As String("", "", "venti", "trenta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta")
    Dim centinaia() As String = Array As String("", "cento", "duecento", "trecento", "quattrocento", "cinquecento", "seicento", "settecento", "ottocento", "novecento")

    Dim nUnita As Int = num Mod 10
    Dim nDecine As Int = (num / 10) Mod 10
    Dim nCentinaia As Int = num / 100

    Dim risultato As String = ""

    risultato = centinaia(nCentinaia)

    If nDecine = 1 Then ' Numeri tra 10 e 19
        risultato = risultato & speciali(nUnita)
    Else
        risultato = risultato & decine(nDecine)
        If nUnita > 0 Then
            risultato = risultato & unita(nUnita)
        End If
    End If

    Return risultato
End Sub

Perché lo hai chiamato "ConvertiCento"? Volevi convertire solo numeri fino a cento o... era il centesimo tentativo di ChatGPT? ?

Hai provato con i miliardi (che poi sono le cifre del mio conto in banca ?)?
 

Aldo's

Active Member
Licensed User
Grazie a tutti.
Ho scelto di usare quella di @MarcoRome aggiungendoci la gestione di due decimali.
Funziona ottimamente.
Grazie
 

Aldo's

Active Member
Licensed User
Ecco qui le sub con la gestione dei due decimali
B4X:
Sub NumeroInLettere(dNum As Double) As String
    Dim Num As Long = NumberFormat2(dNum,1,0,0,False)
    Dim dDec As Double = NumberFormat2(dNum-Num,1,2,2,False)
    Dim sAppo As String = dDec
    Dim sDec As String
    If dDec=0 Then
        sDec = "/00"
    Else
        sDec = "/" & sAppo.SubString(2)
    End If
        
    If Num = 0 Then
        Return "zero"
    End If

    Dim parti() As String = Array As String("", "MILA", "MILIONI", "MILIARDI")
    Dim risultato As String = ""
    Dim parteNumero As Long
    Dim indiceParte As Int = 0

    Do While Num > 0
        parteNumero = Num Mod 1000
        If parteNumero > 0 Then
            If indiceParte = 1 And parteNumero = 1 Then
                risultato = "mille" & risultato
            Else
                risultato = ConvertiCento(parteNumero) & parti(indiceParte) & risultato
            End If
        End If
        Num = Num / 1000
        indiceParte = indiceParte + 1
    Loop
    risultato = risultato & sDec

    Return risultato.Trim
End Sub

Sub ConvertiCento(num As Int) As String
    Dim unita() As String = Array As String("", "UNO", "DUE", "TRE", "QUATTRO", "CINQUE", "SEI", "SETTE", "OTTO", "NOVE")
    Dim speciali() As String = Array As String("DIECI", "UNDICI", "DODICI", "TREDICI", "QUATTORDICI", "QUINDICI", "SEDICI", "DICIASSETTE", "DICIOTTO", "DICIANNOVE")
    Dim decine() As String = Array As String("", "", "VENTI", "TRENTA", "QUARANTA", "CINQUANTA", "SESSANTA", "SETTANTA", "OTTANTA", "NOVANTA")
    Dim centinaia() As String = Array As String("", "CENTO", "DUECENTO", "TRECENTO", "QUATTROCENTO", "CINQUECENTO", "SEICENTO", "SETTECENTO", "OTTOCENTO", "NOVECENTO")

    Dim nUnita As Int = num Mod 10
    Dim nDecine As Int = (num / 10) Mod 10
    Dim nCentinaia As Int = num / 100

    Dim risultato As String = ""

    risultato = centinaia(nCentinaia)

    If nDecine = 1 Then ' Numeri tra 10 e 19
        risultato = risultato & speciali(nUnita)
    Else
        risultato = risultato & decine(nDecine)
        If nUnita > 0 Then
            risultato = risultato & unita(nUnita)
        End If
    End If

    Return risultato
End Sub
 

MarcoRome

Expert
Licensed User
Longtime User
Perché lo hai chiamato "ConvertiCento"? Volevi convertire solo numeri fino a cento o... era il centesimo tentativo di ChatGPT? ?

Hai provato con i miliardi (che poi sono le cifre del mio conto in banca ?)?
Lo ha chiamato (ChatGPT) "ConvertiCento" perchè inizialmente ero partito con una domanda "light" :)
 
Top