明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4171|回复: 24

[函数] [源码]数字转为汉字函数、汉字数字互转

[复制链接]
发表于 2015-10-18 21:43 | 显示全部楼层 |阅读模式
本帖最后由 tryhi 于 2023-5-9 17:14 编辑

在明经群讨论了大半天的数字转函数,只有E大贴出了代码,可惜只支持到万,其他的只见装不见源码,代码写得不好,斗胆献上,仅支持到万亿,请拍砖。


  • (num2str 5000000030101) =>"五万亿零三万零一百零一"
  • (num2str 5012500030101) =>"五万零一百二十五亿零三万零一百零一"



汉字转数字源码在沙发,如有报错请看回复

  1. ;;例子(num2str 5012500030101)
  2. ;;将数字转换为汉字,仅支持到万亿,只支持整数
  3. (defun num2str(num / charofcash i n tempa tempstr)
  4.         ;(setq num 123)
  5.         (setq num (rtos num 2 0));转字符串
  6.         (setq i -1 CharOfCash "")
  7.         (setq n(strlen num))
  8.         (repeat n
  9.                 (setq i(1+ i))
  10.                 (setq TempStr(substr num (- n i)1))
  11.                
  12.                 (setq TempStr (_n2big TempStr))
  13.                 (cond
  14.                         ((= i 0)
  15.                                 (if (= "零" TempStr)
  16.                                         (setq TempStr "")
  17.                                 )
  18.                         )
  19.                         ((= i 1)
  20.                                 (if (/= "零" TempStr)
  21.                                         (setq TempStr (strcat TempStr "十"))
  22.                                 )
  23.                         )
  24.                         ((= i 2)
  25.                                 (if (/= "零" TempStr)
  26.                                         (setq TempStr (strcat TempStr "百"))
  27.                                 )
  28.                         )                        
  29.                         ((= i 3)
  30.                                 (if (/= "零" TempStr)
  31.                                         (setq TempStr (strcat TempStr "千"))
  32.                                 )
  33.                         )               
  34.                         ((= i 4)
  35.                                 (if (= "零" TempStr)
  36.                                         (setq TempStr  "万")
  37.                                         (setq TempStr (strcat TempStr "万"))
  38.                                 )
  39.                         )               
  40.                         ((= i 5)
  41.                                 (if (/= "零" TempStr)
  42.                                         (setq TempStr (strcat TempStr "十"))
  43.                                 )
  44.                         )        
  45.                         ((= i 6)
  46.                                 (if (/= "零" TempStr)
  47.                                         (setq TempStr (strcat TempStr "百"))
  48.                                 )
  49.                         )
  50.                         ((= i 7)
  51.                                 (if (/= "零" TempStr)
  52.                                         (setq TempStr (strcat TempStr "千"))
  53.                                 )
  54.                         )
  55.                         ((= i 8)
  56.                                 (if (= "零" TempStr)
  57.                                         (setq TempStr  "亿")
  58.                                         (setq TempStr (strcat TempStr "亿"))
  59.                                 )
  60.                         )
  61.                         ((= i 9)
  62.                                 (if (/= "零" TempStr)
  63.                                         (setq TempStr (strcat TempStr "十"))
  64.                                 )
  65.                         )
  66.                         ((= i 10)
  67.                                 (if (/= "零" TempStr)
  68.                                         (setq TempStr (strcat TempStr "百"))
  69.                                 )
  70.                         )
  71.                         ((= i 11)
  72.                                 (if (/= "零" TempStr)
  73.                                         (setq TempStr (strcat TempStr "千"))
  74.                                 )
  75.                         )
  76.                         ((= i 12)
  77.                                 (if (/= "零" TempStr)
  78.                                         (setq TempStr (strcat TempStr "万"))
  79.                                 )
  80.                         )
  81.                         
  82.                 )
  83.                 (setq tempa(substr CharOfCash  1 2))
  84.                 (setq CharOfCash(if (= TempStr "零")
  85.                                 (cond
  86.                                         ((= tempa "零")CharOfCash)
  87.                                         ((= tempa "")CharOfCash)
  88.                                         ((= tempa "万")CharOfCash)
  89.                                         ((= tempa "亿")CharOfCash)
  90.                                         (t (strcat TempStr CharOfCash))
  91.                                 )
  92.                         (strcat TempStr CharOfCash)
  93.                 ))
  94.         )
  95.         ;(try-substr CharOfCash 1(-(try-strlen CharOfCash)1))
  96.         (setq temp(substr CharOfCash 1 4))
  97.         (if (= "一十"temp)(substr CharOfCash 3)CharOfCash);去掉一十
  98. )


评分

参与人数 2明经币 +2 金钱 +30 收起 理由
cghdy + 1
LPACMQ + 1 + 30 很给力!

查看全部评分

"觉得好,就打赏"
    共1人打赏

本帖被以下淘专辑推荐:

发表于 2017-7-26 13:17 来自手机 | 显示全部楼层
终于可以两次进到明经
回复 支持 1 反对 0

使用道具 举报

发表于 2024-4-20 23:22 | 显示全部楼层
tryhi 发表于 2024-4-19 10:07
命令: (num2str 10)
"十"

您好,我在两台电脑试了。一台一切正常,另一台在11-19区间会返还“一十一” “一十二”,在10会返还空字符串。代码完全一样
 楼主| 发表于 2024-4-19 10:07 | 显示全部楼层
15019720309 发表于 2024-4-14 23:30
请问为什么输入10返回nil

命令: (num2str 10)
"十"

不知道你是怎么输的
 楼主| 发表于 2015-10-18 21:46 | 显示全部楼层
本帖最后由 tryhi 于 2016-3-23 15:08 编辑
  1. (str2num "一千零八十万八千七百六十七")
  2. ;;汉字转数字
  3. (defun str2num(str)
  4. (defun _qian(w1 / i n num strx)
  5.   (setq w1 (try-StrRegExpReplace w1"零"""))
  6.   (setq w1 (strcat w1"零"))
  7.   (setq w1l(try-StrRegExp w1 ".+?[千百十零]"))
  8.   (setq i -1 n 0)
  9.   (repeat (length w1l)
  10.     (setq i(1+ i) strx(nth i w1l))
  11.     (setq num (strcat(_n2s (substr strx 1 2))(_n2s (substr strx 3 2))))
  12.     (setq n(+ n (atof num)))
  13.   )
  14. )
  15. (if(="十"(substr str 1 2))(setq str(strcat "一"str)))
  16. (setq ls(try-StringSplit str "万"))
  17. (setq w1 (last ls)n 0)
  18. (if (/= ""w1) (setq n (_qian w1)))
  19. (if (< 1(length ls))(setq n(+ n(* 10000(_qian(car ls))))))
  20. (fix n)
  21. )

  22. (defun _n2s(num)
  23.   (cond
  24.     ((= num "零")"")
  25.     ((= num "一")"1")
  26.     ((= num "二")"2")
  27.     ((= num "两")"2")
  28.     ((= num "三")"3")
  29.     ((= num "四")"4")
  30.     ((= num "五")"5")
  31.     ((= num "六")"6")
  32.     ((= num "七")"7")
  33.     ((= num "八")"8")
  34.     ((= num "九")"9")
  35.     ((= num "十")"0")
  36.     ((= num "百")"00")
  37.     ((= num "千")"000")
  38.   )
  39. )
发表于 2015-10-18 21:46 | 显示全部楼层
哈哈 哈哈哈哈
发表于 2015-10-18 21:58 | 显示全部楼层
赞哦~\(≧▽≦)/~
发表于 2015-10-19 00:16 | 显示全部楼层
多谢,源码!!学习学习!!!
发表于 2015-10-19 07:48 | 显示全部楼层
_N2BIG
缺少子程序
发表于 2015-10-19 09:01 | 显示全部楼层
; 错误: no function definition: _N2BIG
 楼主| 发表于 2015-10-19 22:54 | 显示全部楼层
本帖最后由 tryhi 于 2015-10-22 19:39 编辑
ynhh 发表于 2015-10-19 09:01
; 错误: no function definition: _N2BIG
  1. (defun _N2BIG(num)
  2.         (cdr (assoc num '(("0" . "零")("1" . "一")("2" . "二")("3" . "三")("4" . "四")("5" . "五")("6" . "六")("7" . "七")("8" . "八")("9" . "九"))))
  3. )
发表于 2015-10-20 11:26 | 显示全部楼层
1.(num2str 5012500030101)
; 错误: 参数类型错误: stringp nil
 楼主| 发表于 2015-10-20 12:46 | 显示全部楼层
ynhh 发表于 2015-10-20 11:26
1.(num2str 5012500030101)
; 错误: 参数类型错误: stringp nil

_N2BIG函数拷贝有误,已经修改_N2BIG函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 01:15 , Processed in 0.354682 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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