数字转汉字(支持整数和小数)
本帖最后由 langjs 于 2017-10-17 14:05 编辑好久没写程序了,看到群里有个数字转汉字的函数但只支持整数,觉得好玩,就写了一个支持整数和小数的函数
;;; -----------------------------------
;;; 数字转汉字 (支持整数和小数)
;;; 示例:(numtostr 30280030.6007)
;;; 返回:三千零二十八万零三十点六零零七
;;; by:langjs
;;; -----------------------------------
(defun numtostr (num / i j lst1 lst2 lst3 lst4 num p st str)
(setq lst1 (list "" "十" "百" "千")
lst2 (list '("0" "零") '("1" "一") '("2" "二") '("3" "三") ' ("4" "四")
'("5" "五") '("6" "六") '("7" "七") '("8" "八") '("9" "九")
)
num (rtos num 2 16) lst3 '() lst4 '() i -1 P nil
)
(repeat (strlen num)
(setq i (1+ i)str (substr num (- (strlen num) i) 1) )
(if p (setq lst4 (cons str lst4)) (if (= str ".")(setq P "Y")(setq lst3 (cons str lst3))))
)
(setq lst3 (reverse lst3) lst4 (reverse lst4) i -1 j -1 st "" P nil )
(repeat (length lst3)
(setq i (1+ i) j (1+ j) str (nth i lst3) )
(if (/= str "0") (setq P "Y") )
(if p (setq st (strcat (cadr (assoc str lst2)) st)))
)
(if (/= st "") (setq st (strcat "点" st)))
(setq P nil i -1 j -1 )
(repeat (length lst4)
(setq i (1+ i)j (1+ j)str (nth i lst4) )
(if (= (rem i 8) 4) (setq st (strcat "万" st)) )
(if (and (= (rem i 8) 0) (/= i 0))(setq st (strcat "亿" st)))
(if (/= str "0") (setq P "Y"))
(if p
(if (not (and (= "0" str)(> i 1) (= "0" (nth (1- i) lst4))))
(setq st (strcat (cadr (assoc str lst2)) (if (/= str "0") (nth j lst1) "" ) st))
)
)
(if (= j 3)(setq j -1P nil) )
)
(if (= "点" (substr st 1 2)) (setq st (strcat "零" st)))
st
)
梦里水香 发表于 2017-10-21 12:37
我的系统变量dimzin也是8
功能及参数
此函数将依据所给定的 mode、precision、AutoCAD 的UNITMODE 系统变量及DIMZIN尺寸变量来返回一字符串以表示 number。mode 与precision是整型数, 表示所选择的线性单位模式和精确度。AutoCAD 中所提供的mode 值如下:
RTOS 模式
编辑格式
1
科学记数 (Scientific)
2
十进制 (Decimal)
3
工程 (尺和十进位寸) (Engineering)
4
建筑 (尺和分数寸) (Architectural)
5
任意的分数单位 (Fractional)
mode和precision参数值将分别与AutoCAD中的系统变量LUNITS和UPREC的值一致。假如您省略这些参数, 此函数将会使用目前的LUNITS与LUPR-EC值。当您选择Engineering、Architectural或Fractional等单位(即mode值为3、4或5)时, UNITMODE变量将影响所返回的字符串。
范例
例如, 我们设定 DIMZIN=0。则:
语法范例
UNITMODE=0的返回值
UNITMODE=1的返回值
(rtos 17.5 1 4)
"1.7500E+01"
"1.7500E+01"
(rtos 17.5 2 2)
"17.50"
"17.50"
(rtos 17.5 3 2)
"1'-5.50""
"1'5.50""
(rtos 17.5 4 2)
"1'-5 1/2""
"1'5-1/2""
(rtos 17.5 5 2)
"17 1/2"
"17-1/2"
ynhh 发表于 2021-1-4 20:48
(numtostr 1.234) = "一点二三三九九九九九九九九九九九九"
(numtostr 123) = "零点一二三"
还是有点问 ...
(numtostr 123) = "零点一二三"8楼说了解决方法,
(numtostr 1.234) = "一点二三三九九九九九九九九九九九九",将(rtos num 2 16)改成(rtos num 2 15)可以,但我不知道有什么影响,我记得之前学习,点好像也占一位 梦里水香 发表于 2017-10-20 08:47
(numtostr 0.1)
"点一"
程序没有问题的,是因你的系统变量中去掉了头部"0"造成的,
意思是:(rtos 0.1 2 16) 转成了".1" 而非正常的"0.1" (numtostr 123)
"点一二三" 楼主真会玩,顶一个 梦里水香 发表于 2017-10-17 13:41
(numtostr 123)
"点一二三"
试试!真的是这样喔! 开源的都是铁粉 昨天又拜读了一遍您的动态轴侧图工具栏,仰慕阿 顶郎大师,从来都是源码。高人,好人。 在(setq lst3 (reverse lst3) ... 行前加入:
(if (not Lst4) (setq Lst4 Lst3 Lst3 nil))
可解决(numtostr 123)的问题 感谢大师分享 竟然还能这样玩,天哪