PDA

View Full Version : convertire un numero in lettere


Joblack84
21-06-2006, 13:06
Mi servirebbe sapere conme convertire un numero in lettere ad esempio 11 con undici. uso il vb6

andbin
21-06-2006, 13:19
Mi servirebbe sapere conme convertire un numero in lettere ad esempio 11 con undici. uso il vb6Credo che valga per qualunque linguaggio .... non esiste una funzione "standard" che faccia questo, è una cosa troppo specifica.
Io comunque avevo fatto una funzione in "C" che convertiva appunto un numero nella sua forma "letterale". L'algoritmo non è neanche particolarmente complicato, almeno per quanto riguarda l'italiano è semplice.

Joblack84
21-06-2006, 13:25
Credo che valga per qualunque linguaggio .... non esiste una funzione "standard" che faccia questo, è una cosa troppo specifica.
Io comunque avevo fatto una funzione in "C" che convertiva appunto un numero nella sua forma "letterale". L'algoritmo non è neanche particolarmente complicato, almeno per quanto riguarda l'italiano è semplice.

e puoi gentilmente aiutarmi dicendomi l'algoritmo

andbin
21-06-2006, 13:34
e puoi gentilmente aiutarmi dicendomi l'algoritmoCerto ... solo che in questo momento non lo ricordo di preciso! :p Stasera a casa riprendo quel mio (vecchio) sorgente e se vuoi lo posto e lo spiego. ;)

mynos79
21-06-2006, 13:39
Ti riporto un codice che avevo fatto tantissimi anni fa in vb6, assolutamente non ottimizzato ma perfettamente funzionante sia con numeri grandi grandi che con la virgola; restituisce una stringa.

Public Function NumeroInLettere(NrAnalizzato As String, Optional Valuta As String, Optional Formato As Byte) As String
'NrAnalizzato = Numero da convertire
'Valuta = lire, euro, £, € oppure vuoto
'Formato= 0 tutto minuscolo, 1 tutto maiuscolo,
'2 primo carattere maiuscolo se omesso è uguale a 0
Dim Miliardi, Milioni, Migliaia, Centinaia, Centesimi, inLettere
NrAnalizzato = Right("000000000000" & Format(NrAnalizzato, "###0.00"), 15)
NrAnalizzato = Left(NrAnalizzato, 12) & "0" & Right(NrAnalizzato, 2)
If Val(Mid(NrAnalizzato, 1, 3)) = 1 Then Miliardi = "unmiliardo"
If Val(Mid(NrAnalizzato, 1, 3)) > 1 Then Miliardi = DefinisciNumero(Mid(NrAnalizzato, 1, 3)) & "miliardi"
If Val(Mid(NrAnalizzato, 4, 3)) = 1 Then Milioni = "unmilione"
If Val(Mid(NrAnalizzato, 4, 3)) > 1 Then Milioni = DefinisciNumero(Mid(NrAnalizzato, 4, 3)) & "milioni"
If Val(Mid(NrAnalizzato, 7, 3)) = 1 Then Migliaia = "mille"
If Val(Mid(NrAnalizzato, 7, 3)) > 1 Then Migliaia = DefinisciNumero(Mid(NrAnalizzato, 7, 3)) & "mila"
If Val(Mid(NrAnalizzato, 10, 3)) = 1 Then Centinaia = "cento"
If Val(Mid(NrAnalizzato, 10, 3)) > 1 Then Centinaia = DefinisciNumero(Mid(NrAnalizzato, 10, 3))
If Val(Mid(NrAnalizzato, 13, 3)) = 1 Then Centesimi = "uncentesimo"
If Val(Mid(NrAnalizzato, 13, 3)) > 1 Then Centesimi = DefinisciNumero(Mid(NrAnalizzato, 13, 3)) & "centesimi"
If Centinaia = "" And Migliaia = "" And Valuta <> "" Then Valuta = "di" & Valuta
inLettere = Miliardi & Milioni & Migliaia & Centinaia & Valuta & Centesimi
If Formato = 0 Then NumeroInLettere = StrConv(inLettere, vbLowerCase)
If Formato = 1 Then NumeroInLettere = StrConv(inLettere, vbUpperCase)
If Formato = 2 Then NumeroInLettere = StrConv(inLettere, vbProperCase)
End Function

Function DefinisciNumero(Numero000 As String) As String
Dim numero0
Dim nrCento, nrDieci, stNumero0
nrCento = Val(Mid(Numero000, 1, 1))
nrDieci = Val(Mid(Numero000, 2, 2))
numero0 = Array("zero", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", _
"otto", "nove", "dieci", "undici", "dodici", "tredici", "quattordici", _
"quindici", "sedici", "diciassette", "diciotto", "diciannove", "venti", _
"ventuno", "ventidue", "ventitre", _
"ventiquattro", "venticinque", "ventisei", "ventisette", "ventotto", "ventinove", _
"trenta", "trentuno", "trentadue", "trentatre", "trentaquattro", "trentacinque", _
"trentasei", "trentasette", "trentotto", "trentanove", "quaranta", "quarantuno", _
"quarantadue", "quarantatre", "quarantaquattro", "quarantacinque", _
"quarantasei", "quarantasette", "quarantotto", "quarantanove", "cinquanta", "cinquantuno", _
"cinquantadue", "cinquantatre", "cinquantaquattro", "cinquantacinque", "cinquantasei", "cinquantasette", _
"cinquantotto", "cinquantanove", "sessanta", "sessantuno", "sessantadue", "sessantatre", _
"sessantaquattro", "sessantacinque", _
"sessantasei", "sessantasette", "sessantotto", _
"sessantanove", "settanta", "settantuno", _
"settantadue", "settantatre", _
"settantaquattro", "settantacinque", _
"settantasei", "settantasette", "settantotto", _
"settantanove", "ottanta", "ottantuno", _
"ottantadue", "ottantatre", "ottantaquattro", _
"ottantacinque", "ottantasei", "ottantasette", _
"ottantotto", "ottantanove", "novanta", _
"novantuno", "novantadue", "novantatre", _
"novantaquattro", "novantacinque", _
"novantasei", "novantasette", "novantotto", _
"novantanove")
If nrCento = 1 Then stNumero0 = "cento"
If nrCento > 1 Then stNumero0 = numero0(nrCento) & "cento"
If nrDieci > 0 Then stNumero0 = stNumero0 & numero0(nrDieci)

DefinisciNumero = stNumero0
End Function

L' uso è ad esempio questo:
Private Sub Command1_Click()
Text1.Text = NumeroInLettere(123456)
End Sub

mynos79
21-06-2006, 13:44
Ecco, questo l' ho trovato in un altro progetto che avevo fatto tanto tempo fa ... ed è più ottimizzato e corto, ma non supporta i numeri decimali.

Function Lettere(wknumero) As String
Dim WkCentinaia, WkMigliaia, WkMilioni, WkMiliardi, WkStringa As String
Dim pass As Byte
wknumero = Str$(Int(wknumero))
wknumero = Space(12 - Len(wknumero)) + wknumero
WkMiliardi = Left$(wknumero, 3)
WkMilioni = Mid$(wknumero, 4, 3)
WkMigliaia = Mid$(wknumero, 7, 3)
WkCentinaia = Mid$(wknumero, 10, 3)
WkStringa = ""
For pass = 1 To 4
Select Case pass
Case Is = 1
If Val(WkMiliardi) = 1 Then
WkStringa = WkStringa + "unmiliardo"
End If
If Val(WkMiliardi) > 1 Then
WkStringa = WkStringa + NumTrd(WkMiliardi) + "miliardi"
End If
Case Is = 2
If Val(WkMilioni) = 1 Then
WkStringa = WkStringa + "unmilione"
End If
If Val(WkMilioni) > 1 Then
WkStringa = WkStringa + NumTrd(WkMilioni) + "milioni"
End If
Case Is = 3
If Val(WkMigliaia) = 1 Then
WkStringa = WkStringa + "mille"
End If
If Val(WkMigliaia) > 1 Then
WkStringa = WkStringa + NumTrd(WkMigliaia) + "mila"
End If
Case Is = 4
If Val(WkCentinaia) > 0 Then
WkStringa = WkStringa + NumTrd(WkCentinaia)
End If
If Val(WkCentinaia) = 0 Then
If WkStringa = "" Then WkStringa = "zero"
End If
End Select
Next
Lettere = WkStringa
End Function

Function cifranum(item) As String
Dim cifra(27) As String
cifra(1) = "uno"
cifra(2) = "due"
cifra(3) = "tre"
cifra(4) = "quattro"
cifra(5) = "cinque"
cifra(6) = "sei"
cifra(7) = "sette"
cifra(8) = "otto"
cifra(9) = "nove"
cifra(10) = "dieci"
cifra(11) = "undici"
cifra(12) = "dodici"
cifra(13) = "tredici"
cifra(14) = "quattordici"
cifra(15) = "quindici"
cifra(16) = "sedici"
cifra(17) = "diciassette"
cifra(18) = "diciotto"
cifra(19) = "diciannove"
cifra(20) = "venti"
cifra(21) = "trenta"
cifra(22) = "quaranta"
cifra(23) = "cinquanta"
cifra(24) = "sessanta"
cifra(25) = "settanta"
cifra(26) = "ottanta"
cifra(27) = "novanta"
cifranum = cifra(item)
End Function

Function GetCifra(item) As String
Dim CurrItem As String
If item <= 20 Then
CurrItem = cifranum(item)
Else
CurrItem = cifranum((item - 30) / 10 + 21)
End If
GetCifra = CurrItem
End Function

Function NumTrd(WkNum)
Dim WkCif1, WkCif2, WkCif3 As Integer
Dim WkCif As String
WkNum = Space(3 - Len(WkNum)) + WkNum
WkCif = ""
WkCif1 = Val(Left(WkNum, 1))
WkCif2 = Val(Mid$(WkNum, 2, 1))
WkCif3 = Val(Mid$(WkNum, 3, 1))
If WkCif1 = 1 Then
WkCif = "cento"
End If
If WkCif1 > 1 Then
WkCif = GetCifra(WkCif1) + "cento"
End If
If WkCif2 > 1 And (WkCif3 = 1 Or WkCif3 = 8) Then
WkCif = WkCif + Left(GetCifra(WkCif2 * 10), Len(GetCifra(WkCif2 * 10)) - 1)
ElseIf WkCif2 > 1 And WkCif3 > 1 Then
WkCif = WkCif + GetCifra(WkCif2 * 10)
ElseIf WkCif2 > 0 Then
WkCif = WkCif + GetCifra(WkCif2 * 10 + WkCif3)
WkCif3 = 0
End If
If WkCif3 > 0 Then
WkCif = WkCif + GetCifra(WkCif3)
End If
NumTrd = WkCif
End Function


Private Sub Command1_Click()
Text1.Text = Lettere(1234567)
End Sub

Joblack84
21-06-2006, 13:56
Ecco, questo l' ho trovato in un altro progetto che avevo fatto tanto tempo fa ... ed è più ottimizzato e corto, ma non supporta i numeri decimali.

Function Lettere(wknumero) As String
Dim WkCentinaia, WkMigliaia, WkMilioni, WkMiliardi, WkStringa As String
Dim pass As Byte
wknumero = Str$(Int(wknumero))
wknumero = Space(12 - Len(wknumero)) + wknumero
WkMiliardi = Left$(wknumero, 3)
WkMilioni = Mid$(wknumero, 4, 3)
WkMigliaia = Mid$(wknumero, 7, 3)
WkCentinaia = Mid$(wknumero, 10, 3)
WkStringa = ""
For pass = 1 To 4
Select Case pass
Case Is = 1
If Val(WkMiliardi) = 1 Then
WkStringa = WkStringa + "unmiliardo"
End If
If Val(WkMiliardi) > 1 Then
WkStringa = WkStringa + NumTrd(WkMiliardi) + "miliardi"
End If
Case Is = 2
If Val(WkMilioni) = 1 Then
WkStringa = WkStringa + "unmilione"
End If
If Val(WkMilioni) > 1 Then
WkStringa = WkStringa + NumTrd(WkMilioni) + "milioni"
End If
Case Is = 3
If Val(WkMigliaia) = 1 Then
WkStringa = WkStringa + "mille"
End If
If Val(WkMigliaia) > 1 Then
WkStringa = WkStringa + NumTrd(WkMigliaia) + "mila"
End If
Case Is = 4
If Val(WkCentinaia) > 0 Then
WkStringa = WkStringa + NumTrd(WkCentinaia)
End If
If Val(WkCentinaia) = 0 Then
If WkStringa = "" Then WkStringa = "zero"
End If
End Select
Next
Lettere = WkStringa
End Function

Function cifranum(item) As String
Dim cifra(27) As String
cifra(1) = "uno"
cifra(2) = "due"
cifra(3) = "tre"
cifra(4) = "quattro"
cifra(5) = "cinque"
cifra(6) = "sei"
cifra(7) = "sette"
cifra(8) = "otto"
cifra(9) = "nove"
cifra(10) = "dieci"
cifra(11) = "undici"
cifra(12) = "dodici"
cifra(13) = "tredici"
cifra(14) = "quattordici"
cifra(15) = "quindici"
cifra(16) = "sedici"
cifra(17) = "diciassette"
cifra(18) = "diciotto"
cifra(19) = "diciannove"
cifra(20) = "venti"
cifra(21) = "trenta"
cifra(22) = "quaranta"
cifra(23) = "cinquanta"
cifra(24) = "sessanta"
cifra(25) = "settanta"
cifra(26) = "ottanta"
cifra(27) = "novanta"
cifranum = cifra(item)
End Function

Function GetCifra(item) As String
Dim CurrItem As String
If item <= 20 Then
CurrItem = cifranum(item)
Else
CurrItem = cifranum((item - 30) / 10 + 21)
End If
GetCifra = CurrItem
End Function

Function NumTrd(WkNum)
Dim WkCif1, WkCif2, WkCif3 As Integer
Dim WkCif As String
WkNum = Space(3 - Len(WkNum)) + WkNum
WkCif = ""
WkCif1 = Val(Left(WkNum, 1))
WkCif2 = Val(Mid$(WkNum, 2, 1))
WkCif3 = Val(Mid$(WkNum, 3, 1))
If WkCif1 = 1 Then
WkCif = "cento"
End If
If WkCif1 > 1 Then
WkCif = GetCifra(WkCif1) + "cento"
End If
If WkCif2 > 1 And (WkCif3 = 1 Or WkCif3 = 8) Then
WkCif = WkCif + Left(GetCifra(WkCif2 * 10), Len(GetCifra(WkCif2 * 10)) - 1)
ElseIf WkCif2 > 1 And WkCif3 > 1 Then
WkCif = WkCif + GetCifra(WkCif2 * 10)
ElseIf WkCif2 > 0 Then
WkCif = WkCif + GetCifra(WkCif2 * 10 + WkCif3)
WkCif3 = 0
End If
If WkCif3 > 0 Then
WkCif = WkCif + GetCifra(WkCif3)
End If
NumTrd = WkCif
End Function

Private Sub Command1_Click()
Text1.Text = Lettere(1234567)
End Sub

grazie funziona abbastanza bene non funziona sol con le virgole ma è un problema che risolvero

mynos79
21-06-2006, 13:58
Il codice lunghissimo del mio 1° post invece funzia anche con la virgola ...

Joblack84
21-06-2006, 14:00
Il codice lunghissimo del mio 1° post invece funzia anche con la virgola ...

si maquello parte da 100 se scrivo 1 mi scive "cento" cmq forse sbaglio ad inserire il codice cmq grazie mille mi hai salvato da un paio di ore di stress

mynos79
21-06-2006, 14:06
Ops, è vero ... solo 1 mette cento, poi dal 2 in poi funziona bene ... non me ne ero mai accorto :muro:

Dr.Speed
22-06-2006, 06:22
interesserebbe anche a me questa cosa, ma sono un supernubbio, come faccio a provare il tuo programma? cioe dove metto il codice? :D grazie mille

mynos79
22-06-2006, 08:09
Beh, l' ultimo codice che ho postato:

Function Lettere(wknumero) As String
Dim WkCentinaia, WkMigliaia, WkMilioni, WkMiliardi, WkStringa As String
Dim pass As Byte
wknumero = Str$(Int(wknumero))
wknumero = Space(12 - Len(wknumero)) + wknumero
WkMiliardi = Left$(wknumero, 3)
WkMilioni = Mid$(wknumero, 4, 3)
WkMigliaia = Mid$(wknumero, 7, 3)
WkCentinaia = Mid$(wknumero, 10, 3)
WkStringa = ""
For pass = 1 To 4
Select Case pass
Case Is = 1
If Val(WkMiliardi) = 1 Then
WkStringa = WkStringa + "unmiliardo"
End If
If Val(WkMiliardi) > 1 Then
WkStringa = WkStringa + NumTrd(WkMiliardi) + "miliardi"
End If
Case Is = 2
If Val(WkMilioni) = 1 Then
WkStringa = WkStringa + "unmilione"
End If
If Val(WkMilioni) > 1 Then
WkStringa = WkStringa + NumTrd(WkMilioni) + "milioni"
End If
Case Is = 3
If Val(WkMigliaia) = 1 Then
WkStringa = WkStringa + "mille"
End If
If Val(WkMigliaia) > 1 Then
WkStringa = WkStringa + NumTrd(WkMigliaia) + "mila"
End If
Case Is = 4
If Val(WkCentinaia) > 0 Then
WkStringa = WkStringa + NumTrd(WkCentinaia)
End If
If Val(WkCentinaia) = 0 Then
If WkStringa = "" Then WkStringa = "zero"
End If
End Select
Next
Lettere = WkStringa
End Function

Function cifranum(item) As String
Dim cifra(27) As String
cifra(1) = "uno"
cifra(2) = "due"
cifra(3) = "tre"
cifra(4) = "quattro"
cifra(5) = "cinque"
cifra(6) = "sei"
cifra(7) = "sette"
cifra(8) = "otto"
cifra(9) = "nove"
cifra(10) = "dieci"
cifra(11) = "undici"
cifra(12) = "dodici"
cifra(13) = "tredici"
cifra(14) = "quattordici"
cifra(15) = "quindici"
cifra(16) = "sedici"
cifra(17) = "diciassette"
cifra(18) = "diciotto"
cifra(19) = "diciannove"
cifra(20) = "venti"
cifra(21) = "trenta"
cifra(22) = "quaranta"
cifra(23) = "cinquanta"
cifra(24) = "sessanta"
cifra(25) = "settanta"
cifra(26) = "ottanta"
cifra(27) = "novanta"
cifranum = cifra(item)
End Function

Function GetCifra(item) As String
Dim CurrItem As String
If item <= 20 Then
CurrItem = cifranum(item)
Else
CurrItem = cifranum((item - 30) / 10 + 21)
End If
GetCifra = CurrItem
End Function

Function NumTrd(WkNum)
Dim WkCif1, WkCif2, WkCif3 As Integer
Dim WkCif As String
WkNum = Space(3 - Len(WkNum)) + WkNum
WkCif = ""
WkCif1 = Val(Left(WkNum, 1))
WkCif2 = Val(Mid$(WkNum, 2, 1))
WkCif3 = Val(Mid$(WkNum, 3, 1))
If WkCif1 = 1 Then
WkCif = "cento"
End If
If WkCif1 > 1 Then
WkCif = GetCifra(WkCif1) + "cento"
End If
If WkCif2 > 1 And (WkCif3 = 1 Or WkCif3 = 8) Then
WkCif = WkCif + Left(GetCifra(WkCif2 * 10), Len(GetCifra(WkCif2 * 10)) - 1)
ElseIf WkCif2 > 1 And WkCif3 > 1 Then
WkCif = WkCif + GetCifra(WkCif2 * 10)
ElseIf WkCif2 > 0 Then
WkCif = WkCif + GetCifra(WkCif2 * 10 + WkCif3)
WkCif3 = 0
End If
If WkCif3 > 0 Then
WkCif = WkCif + GetCifra(WkCif3)
End If
NumTrd = WkCif
End Function

Private Sub Command1_Click()
Text1.Text = Lettere(1234567)
End Sub

basta che lo copi interamente nel codice di un form; preoccupati di inserire nel form anche una textbox di nome Text1 e un pulsante di nome Command1 ... semplicemente per trasformare un numero in una stringa basta usare la funzione Lettere(numero) che restituisce appunto una stringa ...

Dr.Speed
22-06-2006, 20:43
scusami, cose un form? :stordita:

mynos79
22-06-2006, 20:49
:mc: :mc:
Cos'è un form? :mbe:

Spero tu mi stia prendendo in giro ... o forse no ... :fagiano:

Comunque un form è la maschera del programma, la finestra del programma ...
Quando crei un nuovo progetto in VB ti ritrovi il form vuoto davanti (con solamente l'icona, il titolo standard ed i pulsantini di riduzione e massimizzazione).
Fa doppio click sopra e passi nella pagina in cui puoi inserire il codice relativo al form ... cancella le scritte preesistenti (Private Sub Form_Load ....) ed incolla il codice.
Ora torna alla visualizzazione grafica e disegnaci un pulsante ed una textbox ...

L' ultima riga di codice è quella da modificare:
Text1.Text = Lettere(1234567)

Se ad esempio vuoi inserire tu da programma il valore in una seconda textbox, basta che disegni una seconda textbox (lasci i nomi standard, ovvero Text2) e cambi quella riga con questa:
Text1.Text = Lettere(val(Text2.Text))

Dr.Speed
23-06-2006, 00:10
pultroppo nn ti sto prendendo in giro :)

ora devo capire cos'e un VB, ma cerco con google, grazie mille per la disponibilita :D

Dr.Speed
23-06-2006, 00:12
visual basic, ottimo, ma dove trovo una console di visual basic? mi ricordo che sui vecchi 386-486 bastava scrivere da dos visual basic ma su questi nuovi pc con windows xp nn succede nulla mi sembra :mc: :fagiano:

mynos79
23-06-2006, 08:44
visual basic, ottimo, ma dove trovo una console di visual basic? mi ricordo che sui vecchi 386-486 bastava scrivere da dos visual basic ma su questi nuovi pc con windows xp nn succede nulla mi sembra :mc: :fagiano:

:doh: Che dici ... lo installiamo sto Visual Basic prima di usarlo? :stordita:
Comunque anche in dos non c'era preinstallato il Visual Basic, ma solamente il Basic o GwBasic ... :mbe:

andbin
23-06-2006, 09:23
ma solamente il Basic o GwBasic ... :mbe:C'era il QBasic ;)

mynos79
23-06-2006, 09:30
C'era il QBasic ;)
Eh eh hai ragione :D che bei tempi quando ero piccolino :cry:
Il GwBasic era una versione leggermente diversa dell' Ibm o Olivetti, non ricordo.

Dr.Speed
23-06-2006, 14:53
si si mi ricordo anchio il QBasic :D :D

Joblack84
24-06-2006, 12:52
si il buon vechio qbasic cmq per il codice delle funzioni io consiglio di metterlo in un modulo e non in un form cosi puoi utilizzarlo qunte volte vuoi seza bisogno di riscriverlo