Commandobill 发表于 2022-7-6 14:27:17

罗马数字转换器

从昨天开始我一直在做的事情,我想我会把它扔出去,看看你们怎么想。
 
(defun c:roman ( / stnum stst)
(if (> (setq stnum (atoi (setq stst (getstring "\n Enter number between 1 (I) and 3999 (MMMCMXCIX): ")))) 0)
   (rn stnum)
   (rnrev stst))
)

(defun rnrev (st / sl st pout rn prt)
(setq sl (strlen (setq st (strcase st)))
   pout 0
   rn '(("MMM" . 3000) ("MM" . 2000) ("M" . 1000) ("CM" . 900) ("DCCC" . 800) ("DCC" . 700) ("DC" . 600) ("D" . 500) ("CD" . 400) ("CCC" . 300) ("CC" . 200) ("C" . 100) ("XC" . 90) ("LXXX" . 80) ("LXX" . 70) ("LX" . 60) ("L" . 50) ("XL" . 40) ("XXX" . 30) ("XX" . 20) ("X" . 10) ("IX" . 9) ("VIII" .("VII" . 7) ("VI" . 6) ("V" . 5) ("IV" . 4) ("III" . 3) ("II" . 2) ("I" . 1))); /setq
(while (and (> sl 0)
         (cdr (assoc (substr st 1 1) rn))); /and
   (cond
   ((setq prt(cdr (assoc (substr st 1 4) rn)))
      (setq st   (substr st 5))); /cond 1
   ((setq prt(cdr (assoc (substr st 1 3) rn)))
      (setq st   (substr st 4))); /cond 2
   ((setq prt(cdr (assoc (substr st 1 2) rn)))
      (setq st   (substr st 3))); /cond 3
   ((setq prt(cdr (assoc (substr st 1 1) rn)))
      (setq st   (substr st 2))); /cond 4
   ); /cond
   (setq rn   (cutlst rn prt)
   sl   (strlen st)
   pout (+ pout prt)); /setq
   ); /while
(if (= sl 0)
   (princ pout) (princ "Invalid format")); /if
(princ); silent exit
); /defun

(defun rn (gi / sl is gi numlst pout)
(setq sl (strlen (setq is (itoa gi)))
   numlst (list "1" "2" "3" "4" "5" "6" "7" "8" "9")
   pout "")
(if (and (> gi 0)
      (< gi 4000))
   (progn
   (while (> sl 0)
   (cond
   ((= sl 4)
      (setq pout (strcat pout (nth (vl-position (substr is 1 1) numlst) (list "M" "MM" "MMM")))
      sl 3)); /cond1
   ((= sl 3)
      (setq pout (strcat pout (nth (vl-position (substr is 1 1) numlst) (list "C" "CC" "CCC" "CD" "D" "DC" "DCC" "DCCC" "CM")))
      sl 2)); /cond2
   ((= sl 2)
      (setq pout (strcat pout (nth (vl-position (substr is 1 1) numlst) (list "X" "XX" "XXX" "XL" "L" "LX" "LXX" "LXXX" "XC")))
      sl 1)); /cond3
   ((= sl 1)
      (setq pout (strcat pout (nth (vl-position (substr is 1 1) numlst) (list "I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX")))
      sl 0)); /cond4
   ); /cond
   (setq is (substr is 2))
   ); /while
   (princ pout)
   ); /progn
   (princ "Number Invalid"); else
   ); /if
(princ)
); /defun

(defun cutlst (lst num / z)
(cond
   ((> num 900)
    (setq num 1000)); /cond 1
   ((> num 90)
    (setq num 100 )); /cond 2
   ((> num 9)
    (setq num 10 ))); /cond 3
(setq lst (vl-remove-if
         '(lambda (z) (>= (cdr z) num)) lst)); /setq
); /defun

Lee Mac 发表于 2022-7-6 15:22:34

很好的一张账单——效果很好。不知道你会在哪里使用它,但作为一个新奇的东西很好

Commandobill 发表于 2022-7-6 15:52:19

 
哈哈,是的,我知道。它开始于我试图找出某个罗马数字的含义时。然后我找到了一个转换器,我决定自己做一个。在多次失败后,我终于成功了。
页: [1]
查看完整版本: 罗马数字转换器