土木在线论坛 \ 建筑设计 \ CAD下载及教程 \ 自编小工具

自编小工具

发布于:2009-10-19 14:34:19 来自:建筑设计/CAD下载及教程 [复制转发]
数字转罗马数字
lmsz.gif



命令:lmsz



;|
罗马数字是欧洲在阿拉伯数字(实际上是印度数字)传入之前使用的一种数码,现在应用较少。它的产生晚于中国甲骨文中的数码,更晚于埃及人的十进位数字。但是,它的产生标志着一种古代文明的进步。
备注:阿拉伯数字就是现在国际通用的数字,就是0,1,2,3,4,5,6,7,8,9。阿拉伯数字其实是古代印度人发明的,后来由阿拉伯人传入欧洲,被欧洲人误称为阿拉伯数字。

大约在两千五百年前,罗马人还处在文化发展的初期,当时他们用手指作为计算工具。为了表示一、二、三、四个物体,就分别伸出一、二、三、四个手指;表示五个物体就伸出一只手;表示十个物体就伸出两只手。这种习惯人类一直沿用到今天。人们在交谈中,往往就是运用这样的手势来表示数字的。当时,罗马人为了记录这些数字,便在羊皮上画出Ⅰ、Ⅱ、Ⅲ来代替手指的数;要表示一只手时,就写成“Ⅴ”形,表示大指与食指张开的形状;表示两只手时,就画成“ⅤⅤ”形,后来又写成一只手向上,一只手向下的“Ⅹ”,这就是罗马数字的雏形。
  后来为了表示较大的数,罗马人用符号C表示一百。C是拉丁字“century”的头一个字母,century就是一百的意思。用符号M表示一千。M是拉丁字“mille”的头一个字母,mille就是一千的意思。取字母C的一半,成为符号L,表示五十。用字母D表示五百。若在数的上面画一横线,这个数就扩大一千倍。这样,罗马数字就有下面七个基本符号:Ⅰ(1)Ⅴ(5)Ⅹ(10)L(50)C(100)D(500)M(1000)
  罗马数字与十进位数字的意义不同,它没有表示零的数字,与进位制无关。罗马数字因书写繁难,所以,后人很少采用。现在有的钟表表面仍有用它表示时数的。此外,在书稿章节及科学分类时也有采用罗马数字的。在中文出版物中,罗马数字主要用于某些代码,如产品型号等。计算机 ASCⅡ码收录有合体的罗马数字 1~12。
|;


;功能:数字转换成罗马数字字符串
;条件:字串必须为数字,允许带1位且只带1位后缀
;贱人20090825
(defun c:aa(/ ss txt EndTxt tmp tmp2 tmp3 i Nerr
nArabicValue nOnes nThousands nFiveHundreds
nHundreds nFifties nTens nFives
)
(setvar "CMDECHO" 0)
(setq ss (ssget '((0 . "text"))))
(command "undo" "be")
(if ss (progn
(setq i 0)
(setq Nerr 0)
(repeat (sslength ss)
(setq txt (cdr (assoc 1 (entget (ssname ss i)))))

(if (and (= 'INT (type (read txt))) (/= (substr txt (strlen txt)) "'"))
(progn
(setq nArabicValue (atoi txt))
(setq EndTXT "")
)
(if (= 'INT (type (read (substr txt 1 (- (strlen txt) 1)))) )
(progn
(setq nArabicValue (atoi (substr txt 1 (- (strlen txt) 1))))
(setq EndTXT (substr txt (strlen txt)) )
)
(progn
(setq nArabicValue nil)
(setq Nerr (+ 1 Nerr))
)
)
)
(if nArabicValue
(progn
(setq
;按单位(1000-M,500-D,100-C,50-L,10-X,5-V,1-I)分离
nOnes nArabicValue
nThousands (/ nOnes 1000)
nOnes (- nOnes (* nThousands 1000))
nFiveHundreds (/ nOnes 500)
nOnes (- nOnes (* nFiveHundreds 500))
nHundreds (/ nOnes 100)
nOnes (- nOnes (* nHundreds 100))
nFifties (/ nOnes 50)
nOnes (- nOnes (* nFifties 50))
nTens (/ nOnes 10)
nOnes (- nOnes (* nTens 10))
nFives (/ nOnes 5)
nOnes (- nOnes (* nFives 5))
)
;先按1千数量生成多个M
(setq tmp "" tmp2 "" tmp3 "")
(repeat nThousands
(setq tmp (strcat tmp "M"))
)
;处理其他单位
(If (= nHundreds 4)
;是4
(If (= nFiveHundreds 1)
(setq tmp (strcat tmp "CM"))
(setq tmp (strcat tmp "CD"))
)
;不是4
(progn
(repeat nFiveHundreds
(setq tmp2 (strcat tmp2 "D"))
)
(repeat nHundreds
(setq tmp3 (strcat tmp3 "C"))
)
(setq tmp (strcat tmp tmp2 tmp3))
(setq tmp2 "" tmp3 "")
)
)
(If (= nTens 4)
;是4
(If (= nFifties 1)
(setq tmp (strcat tmp "XC"))
(setq tmp (strcat tmp "XL"))
)
;不是4
(progn
(repeat nFifties
(setq tmp2 (strcat tmp2 "L"))
)
(repeat nTens
(setq tmp3 (strcat tmp3 "X"))
)
(setq tmp (strcat tmp tmp2 tmp3))
(setq tmp2 "" tmp3 "")
)
)
(If (= nOnes 4)
;是4
(If (= nFives 1)
(setq tmp (strcat tmp "IX"))
(setq tmp (strcat tmp "IV"))
)
;不是4
(progn
(repeat nFives
(setq tmp2 (strcat tmp2 "V"))
)
(repeat nOnes
(setq tmp3 (strcat tmp3 "I"))
)
(setq tmp (strcat tmp tmp2 tmp3 EndTxt))
(setq tmp2 "" tmp3 "")
)
)
(entmod (subst (cons 1 tmp) (cons 1 (cdr (assoc 1 (entget (ssname ss i))))) (entget (ssname ss i))))
)
)
(setq i (+ 1 i))
)
))
(command "undo" "e")
(if (/= Nerr 0)
(alert (strcat "共选择了 " (itoa (sslength ss)) " 个字串,其中 " (itoa Nerr) " 个字串不符条件,无法修改"))
)
(setvar "CMDECHO" 1)
(princ)
)

[ 本帖最后由 jianren 于 2009-10-19 14:35 编辑 ]

申明:内容来自用户上传,著作权归原作者所有,如涉及侵权问题,请点击此处联系,我们将及时处理!

全部回复(86 )

只看楼主 我来说两句
  • s308418210
    s308418210 沙发
    我是来学习的
    2013-04-10 13:10:10

    回复 举报
    赞同0
  • 反复清明
    反复清明 板凳
    都是非常实用的功能啊
    2013-02-17 01:15:17

    回复 举报
    赞同0
加载更多
这个家伙什么也没有留下。。。

CAD下载及教程

返回版块

52.09 万条内容 · 682 人订阅

猜你喜欢

阅读下一篇

如何解散PDF组合图

有若干张PDF格式的图组合成一个文件,想打散成一个个单独的PDF文件,需要什么工具?请各位大侠帮帮。谢谢!

回帖成功

经验值 +10