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
Lui sìnon sarà un po' presuntuoso?
Tu no"Non sarò un po' presuntuoso?"
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
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
Il problema è che parte sempre con una supercazzola, poi gli dici che ha sbagliato e corregge.Tanto presuntuoso non è ... visto i risultati in pochi secondi ? ? ?
Il suo "Certamente!" è da presuntuosi ?Tanto presuntuoso non è ... visto i risultati in pochi secondi ? ? ?
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
Sto provando io stesso, ma vedo che la funzione riceve un Int, il che significherebbe "solo" fino a un paio di miliardi, poco più. Cambierò in Long.Hai provato con i miliardi (che poi sono le cifre del mio conto in banca ?)?
Uhm... va in crash; me tocca studia' !Cambierò in Long.
C'è poco da studiare, non serve sostituire gli Int in Long, quella funzione va bene solo per cifre fino a 999.Uhm... va in crash; me tocca studia' !
ok, funziona bene, avevo chiamato la seconda, che invece è usata dalla prima e va chiamata questa.C'è poco da studiare, non serve sostituire gli Int in Long, quella funzione va bene solo per cifre fino a 999.
P.S. UNO momento, non mi ero nemmeno accorto che sono due funzioni!
Alura dovresti pubblicare questa utile modificaaggiungendoci la gestione di due decimali
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
Lo ha chiamato (ChatGPT) "ConvertiCento" perchè inizialmente ero partito con una domanda "light"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 ?)?
Sarebbe?Approfitto per chiedervi se avete fatto la "verifica dell'età" su chatgpt