http://digilander.libero.it/Cenati

Da numeri a lettere

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript

 

 

 

 

 

Trasforma un numero nella sua descrizione in lettere

Scrivi un numero nella finestra che appare avviando lo script.

Apparirà l'equivalente in tutte lettere in un'altra finestra, pronto per essere copiato e incollato.

Il programma proncipale in realtà è solo una chiamata alla funzione "TrasformaInLettere", che può essere riutilizzata in altri programmi per trasformare un numero come 13 in "tredici/00". Il programma è stato scritto per tradurre degli importi in euro.

La prima parte del codice estrae dal numero i primi due decimali, che saranno usati più avanti per i centesimi di euro.

Il numero da trasformare in lettere viene gestito come una stringa, quindi si aggiunge alla sua sinistra una serie di zeri. A questo punto la stringa viene divisa in pezzi di tre caratteri, che nel codice sono definite "terzine". Ogni singola terzina viene viene inviata ad una seconda funzione che la trasforma in lettere. Ogni risultato di questa funzione viene concatenato al precedente per costruire il numero completo. L'istruzione if lett="" then lett="zero" gestisce l'eccezione di un input pari a zero.

La successiva istruzione TrasformaInLettere=lett&"/"&dec ricompone il numero in lettere con i due decimali che ho estratto precedentemente. Se si vuole ottenere solo il numero in lettere è sufficiente lasciare solo TrasformaInLettere= lett e togliere quindi le istruzioni che concatenano la barra e i decimali.

Il cuore del programma è quindi la funzione TrasformaTerzina. Questa riceve dalla funzione chiamante la terzina (la stringa nnn) e la posizione della terzina all'interno del numero da convertire. Per esempio nel numero 1.234.567 verrà inviata la terzina "567" con posizione 1, la terzina "234" con posizione 2 e la terzina "001" con posizione 3.

In un vettore vengono registrati, in lettere, i numeri da uno a diciannove, e poi tutte le decine da venti a novanta. Il primo passo valuta il numero di centinaia. Se è uno comincia a comporre il numero con "cento" e non con "unocento". Per i numeri da due a nove usa il numero stesso e ci aggiunge il testo "cento". Se è zero non fa nulla.

In seguito la trasformazione del numero prosegue con le ultime due cifre della terzina, cioè le decine e le unità. Se il numero "x" da convertire è compreso tra uno e diciannove si utilizza il vettore così come è, quindi con il valore n(x). Se il numero è maggiore di diciannove viene scomposto in decine + unità. Si usa quindi la concatenazione delle due stringhe: il vettore delle decine (venti, trenta, ecc) appiccicato al vettore delle unità (uno, due, tre, ecc). Un paio di controlli gestiscono le eccezioni correggendo il risultato OttantAotto in Ottantotto. Questo è necessario solo per le cifre che finiscono per uno o per otto.

A seconda delle posizione della terzina nel numero da convertire, le istruzioni seguenti aggiungono "mila", "milioni" e "miliardi". E nel contempo controllano che il valore non sia pari ad uno e nel caso sostituiscono "unomila" con mille.

Copia il programma riportato qui sotto in un file con estensione ".vbs" oppure scarica l'archivio zip contentente lo script num2lett.vbs, num2lett.doc (Word) e num2lett.xls (Excel). Ci sono piccole variazioni per permettere di utilizzare la macro anche in questi applicativi. Word permette di usare delle formule nelle tabelle (somma, media, ecc), ma non formule create dall'utente. Per trasformare da cifre a lettere ho quindi usato una combinazione di tasti che richiama la macro. In Excel invece si può usare la mia funzione come se fosse una funzione predefinita. I files non sono protetti e tutto il codice è completamente visibile.

Cenati Giovanni.


        
'************************************************
' File:    Num2Lett.vbs
' Autore:  Giovanni Cenati http://digilander.libero.it/Cenati
' Codice vbs liberamente utilizzabile citando il sito.
'         
'************************************************
n=inputbox("Trasforma numero in lettere","Inserisci il numero:")
msgbox Trasformainlettere(n) 

'-------------------------------------------------------
'************************************************
' File:    Trasforma in lettere.vbs (funzione)
' Autore:  Giovanni Cenati 
' http://digilander.libero.it/Cenati
' Codice vbs liberamente utilizzabile citando il sito.
'         
'************************************************
function TrasformaInLettere(byval n)
	dim i, dec, lun, lett
	dim tri(5)
	n=cdbl(n)'Il tipo double è il più capiente
	dec=Right(formatnumber(n,2),2)'estrae i due decimali
	num=cstr(fix(n))

	Str=cstr("000000000000000000000"&num)
	lun=len(Str)
	for i=1 to 5
		'seziona la stringa 
		tri(i)=mid(Str,lun-(i*3)+1,3)
		'Il numero ora è composto da terzine tri(5)& tri(4)& tri(3)& tri(2)& tri(1).
		if tri(i)>0 then lett= TrasformaTerzina(tri(i),i) & lett
	next 
	if lett="" then lett="zero"
	TrasformaInLettere= lett&"/"&dec
end function

function TrasformaTerzina(tri,t)
'tri è la terzina "nnn" da convertire.
't è il numero della terzina nell'ordine:
't=1 va da 1 a 999
't=2 va da 1000 a 999000, quindi sono le migliaia
't=3 sono i milioni, ecc
	dim ultimeduecifre,ris,decine,unita
	dim n(30) 'tutte le cifre in lettere
	n(0)=""
	n(1)="uno":n(2)="due":n(3)="tre":n(4)="quattro":n(5)="cinque"
	n(6)="sei":n(7)="sette":n(8)="otto":n(9)="nove":n(10)="dieci"
	n(11)="undici":n(12)="dodici":n(13)="tredici":n(14)="quattordici":n(15)="quindici"
	n(16)="sedici":n(17)="diciassette":n(18)="diciotto":n(19)="diciannove"
	n(22)="venti":n(23)="trenta":n(24)="quaranta":n(25)="cinquanta"
	n(26)="sessanta":n(27)="settanta":n(28)="ottanta":n(29)="novanta"
	
	'gestisce le centinaia
	If left(tri,1)=1 then ris="cento" 'se è 1xx allora è cento
      if left(tri,1)>1 then ris=n(cint(left(tri,1)))&"cento"
      'se è nxx con n tra 2 e 9 allora usa n+"cento"
	
	'gestisce le decine: da 1 a 19 e da venti in poi
	Ultimeduecifre=cint(right(tri,2))
	if Ultimeduecifre < 20 then 
		ris=ris&n(Ultimeduecifre)  'da uno a diciannove: prende i numeri già pronti.
	else
		'gestisce separatamente decine ed unità per valori da venti in poi
		Decine=mid(tri,2,1)
		Unita=right(tri,1)
		ris=ris & n(20+decine) 'da n(22) è venti, n(23) è trenta,ecc.
		if Unita=1 or Unita=8 then ris=left(ris,len(ris)-1)
              'toglie l'ultima lettera per evitare "trentAuno"
		Ris=ris & n(Unita) 'aggiunge uno, due , tre
	end if	
	
	'gestisce la posizione della terzina nel numero (centinaia, migliaia, ecc.
	if t=2 then
		ris=ris&"mila"
		if tri=1 then ris="mille"
	end if
	if t=3 then
		ris=ris&"milioni"
		if tri=1 then ris="unmilione"
	end if
	if t=4 then
		ris=ris&"miliardi"
		if tri=1 then ris="unmiliardo"
	end if
	if t=5 then
		ris=ris&"milamiliardi"
		if tri=1 then ris="millemiliardi"
	end if
	
	TrasformaTerzina=Ris
end function
'-------------------------------------------------------

Cenati Giovanni

 

 
 

© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com