cg-Cad

Lisp »Tips 'n Tricks »Traduttore »1 »2 »3 »4

N2c vers. 2

;|

   N2C.LSP (vers. 2) (C) 2005 by Claudio Piccini.
   www.cg-cad.com

   Traduce un numero in lettere
   Es. 145 -> centoquarantacinque

   Limiti: 
   valore max. 9999999

|;

(defun c:n2c ( / lstUnit lstDec lst10_19
                 numero stringa lstr nc7 i
                 n1 n2 n3 n4 n5 n6 n7
                 cNumero str1 str2 str
 )

 (setq lstUnit 
  (list 
   "zero" "uno" "due" "tre" "quattro" 
   "cinque" "sei" "sette" "otto" "nove"
  )
 )
 (setq lstDec 
  (list 
   "zero" "dieci" "venti" "trenta" 
   "quaranta" "cinquanta" "sessanta" 
   "settanta" "ottanta" "novanta"
  )
 )
 (setq lst10_19 
  (list 
   "zero" "dieci" "undici" "dodici" "tredici" "quattordici" 
   "quindici" "sedici" "diciassette" "diciotto" "diciannove"
  )
 )

 (setq numero (getreal "\n numero? "))
 
 (setq stringa (rtos numero 2 0))

 (setq lstr (strlen stringa))

 (setq nc7 (- 7 lstr))

 (setq i 0)
 (while (< i nc7)
  (setq stringa (strcat "0" stringa))
  (setq i (1+ i)) 
 )

 (setq n1 (atoi(substr stringa 7 1))
       n2 (atoi(substr stringa 6 1))
       n3 (atoi(substr stringa 5 1))
       n4 (atoi(substr stringa 4 1))
       n5 (atoi(substr stringa 3 1))
       n6 (atoi(substr stringa 2 1))
       n7 (atoi(substr stringa 1 1))
 )

 (cond
  ((= n7 0)(setq cNumero ""))
  ((= n7 1)(setq cNumero "unmilione"))
  ((> n7 1)(setq cNumero (strcat (nth n7 lstUnit) "milioni")))
 )
 (cond 
  ((= n6 0)(setq cNumero (strcat cNumero ""))) ; spazio
  ((= n6 1)(setq cNumero (strcat cNumero "cento")))
  ((> n6 1)(setq cNumero (strcat cNumero (nth n6 lstUnit) "cento")))
 )
 (if (= n5 0)
  (setq cNumero (strcat cNumero "")) ; spazio
  (if (= n4 0)
   (setq cNumero (strcat cNumero (nth n5 lstDec)))
   (if (= n5 1)
    (setq cNumero (strcat cNumero (nth (1+ n4) lst10_19) "mila"))
    (setq cNumero (strcat cNumero (nth n5 lstDec)))
   )
  )
 ) 
 (if (= n4 0)
  (setq cNumero (strcat cNumero "")) ; spazio
  (if (= n5 1)
   (setq cNumero (strcat cNumero "")) ; spazio
   (setq cNumero (strcat cNumero (nth n4 lstUnit)))
  )
 )
 (if (= (+ n4 n5 n6) 0)
  (setq cNumero (strcat cNumero "")) ; spazio
  (if (= n4 1)
   (setq cNumero (strcat cNumero "mille"))
   (setq cNumero (strcat cNumero "mila"))
  )
 )
 (if (= n3 0)
  (setq cNumero (strcat cNumero "")) ; spazio
  (if (= n3 1)
   (setq cNumero (strcat cNumero "cento"))
   (setq cNumero (strcat cNumero (nth n3 lstUnit) "cento"))
  )
 )
 (if (= n2 0)
  (setq cNumero (strcat cNumero "")) ; spazio
  (if (= n1 0)
   (setq cNumero (strcat cNumero (nth n2 lstDec)))
   (if (= n2 1)
    (setq cNumero (strcat cNumero (nth (1+ n1) lst10_19)))
    (setq cNumero (strcat cNumero (nth n2 lstDec)))
   )
  )
 )
 (if (= n1 0)
  (setq cNumero (strcat cNumero "")) ; spazio
  (if (= n2 1)
   (setq cNumero (strcat cNumero "")) ; spazio
   (setq cNumero (strcat cNumero (nth n1 lstUnit)))
  )
 )

 (setq str "")
 (setq nCar (strlen cNumero))
 (if (wcmatch cNumero "*oo*") ; oo->o (es. 980)
  (progn
   (setq i 1)
   (while (< i nCar)
    (if (= (substr cNumero i 2) "oo")
     (progn
      (setq str1 (substr cNumero 1 i))
      (setq str2 (substr cNumero (+ i 2)))
      (setq str (strcat str str1 str2))
      (setq cNumero str)
      (setq str "")
     )
    )
    (setq i (1+ i))
   )
  )
 )

 (setq str "")
 (setq nCar (strlen cNumero))
 (if (wcmatch cNumero "*tao*") ; tao->to (es. 88)
  (progn
   (setq i 1)
   (while (< i nCar)
    (if (= (substr cNumero i 3) "tao")
     (progn
      (setq str1 (substr cNumero 1 i))
      (setq str2 (substr cNumero (+ i 2)))
      (setq str (strcat str str1 str2))
      (setq cNumero str)
      (setq str "")
     )
    )
    (setq i (1+ i))
   )
  )
 )

 (setq str "")
 (setq nCar (strlen cNumero))
 (if (wcmatch cNumero "*tiu*") ; tiu->tu (es. 21)
  (progn
   (setq i 1)
   (while (< i nCar)
    (if (= (substr cNumero i 3) "tiu")
     (progn
      (setq str1 (substr cNumero 1 i))
      (setq str2 (substr cNumero (+ i 2)))
      (setq str (strcat str str1 str2))
      (setq cNumero str)
      (setq str "")
     )
    )
    (setq i (1+ i))
   )
  )
 )

 (setq str "")
 (setq nCar (strlen cNumero))
 (if (wcmatch cNumero "*tio*") ; tio->to (es. 28)
  (progn
   (setq i 1)
   (while (< i nCar)
    (if (= (substr cNumero i 3) "tio")
     (progn
      (setq str1 (substr cNumero 1 i))
      (setq str2 (substr cNumero (+ i 2)))
      (setq str (strcat str str1 str2))
      (setq cNumero str)
      (setq str "")
     )
    )
    (setq i (1+ i))
   )
  )
 )

 (setq str "")
 (setq nCar (strlen cNumero))
 (if (wcmatch cNumero "*tau*") ; tau->tu (es. 91)
  (progn
   (setq i 1)
   (while (< i nCar)
    (if (= (substr cNumero i 3) "tau")
     (progn
      (setq str1 (substr cNumero 1 i))
      (setq str2 (substr cNumero (+ i 2)))
      (setq str (strcat str str1 str2))
      (setq cNumero str)
      (setq str "")
     )
    )
    (setq i (1+ i))
   )
  )
 )

 (setq str "")
 (if (= (substr cNumero 1 8) "unomille")
  (progn
   (setq cNumero (substr cNumero 4))
   (setq str (strcat str cNumero))
   (setq cNumero str)
   (setq str "")
  )
 )

 (setq str "")
 (setq nCar (strlen cNumero))
 (if (wcmatch cNumero "*mille*")
  (progn
   (setq i 1)
   (while (< i nCar)
    (if (and (= (substr cNumero i 5) "mille")(> i 1)) 
     (progn
      (setq str1 (substr cNumero 1 (1- i)))
      (setq str2 (substr cNumero (+ i 5)))
      (setq str (strcat str str1 "mila" str2))
      (setq cNumero str)
      (setq str "")
     )
    )
    (setq i (1+ i))
   )
  )
 )

 (setq str "")
 (if (= (substr cNumero 1 16) "unmilioneunomila")
  (progn
   (setq str1 (substr cNumero 1 9))
   (setq str2 (substr cNumero 17))
   (setq str (strcat str str1 "mille" str2))
   (setq cNumero str)
   (setq str "")
  )
 )

 (setq str "")
 (setq nCar (strlen cNumero))
 (if (wcmatch cNumero "*milioniunomila*")
  (progn
   (setq i 1)
   (while (< i nCar)
    (if (= (substr cNumero i 14) "milioniunomila")
     (progn
      (setq str1 (substr cNumero 1 (+ i 6)))
      (setq str2 (substr cNumero (+ i 14)))
      (setq str (strcat str str1 "mille" str2))
      (setq cNumero str)
      (setq str "")
     )
    )
    (setq i (1+ i))
   )
  )
 )

 (setq str "")
 (setq nCar (strlen cNumero))
 (if (wcmatch cNumero "*milamila*")
  (progn
   (setq i 1)
   (while (< i nCar)
    (if (= (substr cNumero i 8) "milamila")
     (progn
      (setq str1 (substr cNumero 1 (1- i)))
      (setq str2 (substr cNumero (+ i 4)))
      (setq str (strcat str str1 str2))
      (setq cNumero str)
      (setq str "")
     )
    )
    (setq i (1+ i))
   )
  )
 )

 (princ cNumero)
 (princ)
)
;;;eof

Test del lisp

Command: n2c
numero? 8888888
ottomilioniottocentottantottomilaottocentottantotto

N2C
numero? 21
ventuno

N2C
numero? 998
novecentonovantotto

N2C
numero? 28
ventotto

N2C
numero? 98
novantotto

N2C
numero? 101000
centounomila

N2C
numero? 1974
millenovecentosettantaquattro

Analisi del lisp

Questa versione del lisp usa la funzione (wcmatch stringa stringa_di_ricerca) per cercare all'interno della stringa le occorrenze oo tao tiu tio tau unomille....
Wcmatch restituisce un valore di verità se la stringa di ricerca è presente altrimenti restituisce nil.

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 22 Aprile 2005