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
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
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. ;)
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
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
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
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
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:
: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:
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:
ma solamente il Basic o GwBasic ... :mbe:C'era il QBasic ;)
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.