'===========================================================================
' Subject: NUMBER TO LITERAL (ITALIAN)        Date: 03-19-97 (15:00)       
'  Author: Angelo Ken Pesce                   Code: QB, QBasic, PDS        
'  Origin: us0082@uniserv.uniplan.it        Packet: MISC.ABC
'===========================================================================
DECLARE SUB readdata ()
DECLARE FUNCTION u$ (i!)
DECLARE FUNCTION d$ (i!)
DECLARE FUNCTION d1$ (i!)
DECLARE FUNCTION c$ (i!)
DECLARE FUNCTION m$ (i!)
DECLARE FUNCTION m1$ (i$)
DECLARE FUNCTION m2$ (i$)
DECLARE FUNCTION decod$ (i$)
DECLARE SUB init ()
REM ----------------------------------------------------------
DEFLNG A-Z
DIM SHARED unit(9) AS STRING
DIM SHARED dec(9) AS STRING
DIM SHARED dec1(8) AS STRING
DIM SHARED millepre(2) AS STRING
DIM SHARED miliopre(2) AS STRING
DIM SHARED miliapre(2) AS STRING
REM ----------------------------------------------------------
DATA "zero","uno","due","tre","quattro","cinque","sei","sette","otto","nove","."
DATA "dieci", "undici", "dodici", "tredici", "quattordici", "quindici", "sedici", "diciassette", "diciotto", "diciannove","."
DATA "venti","trenta","quaranta","cinquanta","sessanta","settanta","ottanta","novanta","."
DATA "mille","mila","."
DATA "unmilione","milioni","."
DATA "unmiliardo","miliardi","."
REM ----------------------------------------------------------
CALL init
DO
INPUT "Numero (premi invio per uscire)"; i$
PRINT : PRINT "----"
PRINT "Cifre:"; LEN(i$): PRINT
dd$ = decod(i$)
PRINT "> "; dd$
IF dd$ = "**ERR.2**" THEN PRINT : PRINT "Errore n.2: Numero fuori limite"
PRINT "----": PRINT : PRINT
LOOP

DEFSNG A-Z
FUNCTION c$ (i)
REM da 100 a 999
i$ = STR$(i)
pre$ = LEFT$(i$, 2)
pre1$ = RIGHT$(i$, 2)
pr = VAL(pre$)
pr1 = VAL(pre1$)
IF pr = 1 THEN d11$ = "" ELSE d11$ = u$(pr)
SELECT CASE pr1
CASE IS = 0
c$ = d11$ + "cento"
CASE IS <= 9
c$ = d11$ + "cento" + u$(pr1)
CASE IS <= 19
c$ = d11$ + "cento" + d$(pr1)
CASE ELSE
IF VAL(LEFT$(pre1$, 1)) = 8 THEN add$ = "cent" ELSE add$ = "cento"
c$ = d11$ + add$ + d1$(pr1)
END SELECT
END FUNCTION

FUNCTION d$ (i)
REM da dieci a diciannove
d$ = dec(i - 10)
END FUNCTION

FUNCTION d1$ (i)
REM da venti a novantanove
i$ = STR$(i)
decimal$ = LEFT$(i$, 2)
unit1$ = RIGHT$(i$, 1)
IF VAL(unit1$) = 0 THEN GOTO vz1
IF VAL(unit1$) = 1 OR VAL(unit1$) = 8 THEN
d11$ = LEFT$(dec1(VAL(decimal$) - 1), LEN(dec1(VAL(decimal$) - 1)) - 1)
ELSE d11$ = dec1(VAL(decimal$) - 1)
END IF
d1$ = d11$ + u(VAL(unit1$))
GOTO ve1
vz1:
d1$ = dec1(VAL(decimal$) - 1)
GOTO ve1
ve1:
END FUNCTION

FUNCTION decod$ (i$)
IF i$ = "" THEN END
i = VAL(i$)
SELECT CASE i
CASE IS <= 9
decod$ = u$(i)
CASE IS <= 19
decod$ = d$(i)
CASE IS <= 99
decod$ = d1$(i)
CASE IS <= 999
decod$ = c$(i)
CASE IS <= 999999
decod$ = m$(i)
CASE ELSE
l = LEN(i$)
SELECT CASE l
CASE IS < 10
decod$ = m1$(i$)
CASE IS < 16
decod$ = m2$(i$)
CASE ELSE
decod$ = "**ERR.2**"
END SELECT
END SELECT
END FUNCTION

SUB init
WIDTH 80, 50: CLS
COLOR 10
PRINT "--------------------------------------"
PRINT "======================================"
PRINT "Angelo KEN Pesce 1997"
PRINT "Convertitore Cifre > Lettere": PRINT
PRINT "Versione 1.7": PRINT : PRINT
PRINT "Limite massimo corrente: 999.999.999.999.999 (15 cifre, 24 passaggi)": PRINT : PRINT
CALL readdata
PRINT "======================================"
PRINT "--------------------------------------": PRINT : PRINT
COLOR 2
END SUB

FUNCTION m$ (i)
REM fino a 999999
i$ = STR$(i)
r$ = RIGHT$(i$, 3)
l$ = LEFT$(i$, LEN(i$) - 3)
rr = VAL(r$)
SELECT CASE rr
CASE IS = 0
r1$ = ""
CASE IS <= 9
r1$ = u(rr)
CASE IS <= 19
r1$ = d(rr)
CASE IS <= 99
r1$ = d1(rr)
CASE ELSE
r1$ = c(rr)
END SELECT
rl = VAL(l$)
IF rl = 1 THEN l1$ = "": k1$ = millepre(1): GOTO ex1 ELSE k1$ = millepre(2)
SELECT CASE rl
CASE IS <= 9
l1$ = u(rl)
CASE IS <= 19
l1$ = d(rl)
CASE IS <= 99
l1$ = d1(rl)
CASE ELSE
l1$ = c(rl)
END SELECT
ex1:
m$ = l1$ + k1$ + r1$
END FUNCTION

FUNCTION m1$ (i$)
REM fino a 999999999
r$ = RIGHT$(i$, 6)
l$ = LEFT$(i$, LEN(i$) - 6)
rr = VAL(r$)
SELECT CASE rr
CASE IS = 0
r1$ = ""
CASE IS <= 9
r1$ = u(rr)
CASE IS <= 19
r1$ = d(rr)
CASE IS <= 99
r1$ = d1(rr)
CASE IS <= 999
r1$ = c(rr)
CASE ELSE
r1$ = m(rr)
END SELECT
rl = VAL(l$)
IF rl = 1 THEN l1$ = "": k2$ = miliopre(1): GOTO ex11 ELSE k2$ = miliopre(2)
SELECT CASE rl
CASE IS <= 9
l1$ = u(rl)
CASE IS <= 19
l1$ = d(rl)
CASE IS <= 99
l1$ = d1(rl)
CASE ELSE
l1$ = c(rl)
END SELECT
ex11:
m1$ = l1$ + k2$ + r1$
END FUNCTION

FUNCTION m2$ (i$)
REM fino a 999.999.999.999.999
REM Passaggi massimi: 24
r$ = RIGHT$(i$, 9)
l$ = LEFT$(i$, LEN(i$) - 9)
rr = VAL(r$)
SELECT CASE rr
CASE IS = 0
r1$ = ""
CASE IS <= 9
r1$ = u(rr)
CASE IS <= 19
r1$ = d(rr)
CASE IS <= 99
r1$ = d1(rr)
CASE IS <= 999
r1$ = c(rr)
CASE IS <= 999999
r1$ = m(rr)
CASE ELSE
r1$ = m1(r$)
END SELECT
rl = VAL(l$)
IF rl = 1 THEN l1$ = "": k3$ = miliapre(1): GOTO ex111 ELSE k3$ = miliapre(2)
SELECT CASE rl
CASE IS <= 9
l1$ = u(rl)
CASE IS <= 19
l1$ = d(rl)
CASE IS <= 99
l1$ = d1(rl)
CASE IS <= 999
l1$ = c(rl)
CASE ELSE
l1$ = m(rl)
END SELECT
ex111:
m2$ = l1$ + k3$ + r1$
END FUNCTION

SUB readdata
PRINT "Lettura dati:";
FOR i = 0 TO 9
READ unit(i)
NEXT
GOSUB err1
FOR i = 0 TO 9
READ dec(i)
NEXT
GOSUB err1
FOR i = 1 TO 8
READ dec1(i)
NEXT
GOSUB err1
FOR i = 1 TO 2
READ millepre(i)
NEXT
GOSUB err1
FOR i = 1 TO 2
READ miliopre(i)
NEXT
GOSUB err1
FOR i = 1 TO 2
READ miliapre(i)
NEXT
GOSUB err1
GOTO ext3
err1:
READ a$
n = n + 1
IF a$ <> "." THEN PRINT "Errore n.1: Errore lettura dati": END ELSE PRINT n; ":OK  ";
RETURN
ext3:
PRINT
END SUB

FUNCTION u$ (i)
REM da zero a nove
u$ = unit(i)
END FUNCTION
