明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6158|回复: 29

[函数] 数字转汉字(支持整数和小数)

[复制链接]
发表于 2017-10-17 11:11:46 | 显示全部楼层 |阅读模式
本帖最后由 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 -1  P nil  ) )
  )
  (if (= "点" (substr st 1 2)) (setq st (strcat "零" st)))
  st
)

评分

参与人数 1明经币 +1 收起 理由
cchessbd + 1 经过我的测试,这个lsp有很多bug。等我修复.

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2017-10-21 17:43:32 | 显示全部楼层
梦里水香 发表于 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"






发表于 2023-3-24 17:40:22 | 显示全部楼层
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 11:13:56 | 显示全部楼层

程序没有问题的,是因你的系统变量中去掉了头部"0"造成的,
意思是:(rtos 0.1 2 16) 转成了".1" 而非正常的"0.1"
发表于 2017-10-17 13:41:37 | 显示全部楼层
(numtostr 123)
"点一二三"
发表于 2017-10-17 13:59:37 | 显示全部楼层
楼主真会玩,顶一个
发表于 2017-10-17 16:27:19 | 显示全部楼层
梦里水香 发表于 2017-10-17 13:41
(numtostr 123)
"点一二三"

试试!真的是这样喔!
发表于 2017-10-17 16:40:08 | 显示全部楼层
开源的都是铁粉
发表于 2017-10-17 18:59:42 | 显示全部楼层
昨天又拜读了一遍您的动态轴侧图工具栏,仰慕阿
发表于 2017-10-18 00:01:17 来自手机 | 显示全部楼层
顶郎大师,从来都是源码。高人,好人。
发表于 2017-10-18 19:57:00 | 显示全部楼层
在(setq lst3 (reverse lst3) ... 行前加入:
(if (not Lst4) (setq Lst4 Lst3 Lst3 nil))
可解决(numtostr 123)的问题
发表于 2017-10-19 08:11:47 | 显示全部楼层
感谢大师分享
发表于 2017-10-19 09:48:55 | 显示全部楼层
竟然还能这样玩,天哪
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 13:39 , Processed in 0.206450 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表