Italian [Risolto] Conversioni numeri in parole

Aldo's

Well-Known 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
 

MarcoRome

Expert
Licensed User
Longtime User







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



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

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

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

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

Aldo's

Well-Known 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"
 

Sabotto

Well-Known Member
Licensed User
Approfitto per chiedervi se avete fatto la "verifica dell'età" su chatgpt
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…