明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 353|回复: 4

[源码] 数字转汉字

  [复制链接]
发表于 2024-6-25 10:15 | 显示全部楼层 |阅读模式
  1. 假如以字符串形式输入,愿意动手的,可以在现在的基础上无限扩展,最好是过亿之后,我建议把字符串拆分成2段,千万亿与千万,除了最终单位亿,其余表达是一样,因为暂时想不到哪里需要用那么大的大写数字,就不写了
  2. (defun _Cii2BIG(num)
  3.         (cdr (assoc num '((48 . "零")(49 . "一")(50 . "二")(51 . "三")(52 . "四")(53 . "五")(54 . "六")(55 . "七")(56 . "八")(57 . "九"))))
  4. )
  5. (defun num2big (num / *error* str lst _biglst _bigunit zuhe chuli1 chuli2)
  6. (defun *error* (s)
  7.   (vl-bt)
  8. )
  9. (if (numberp num)
  10.    (setq str (itoa (fix num)))
  11.    (setq str num)
  12.   )
  13.   (setq lst (vl-string->list str))
  14.   (setq _biglst (mapcar '_Cii2BIG lst))
  15.   (setq _bigunit '("" "十" "百" "千" "万" "十" "百" "千" "亿" "十" "百" "千" "万"))
  16.   ;;;;数字与单位组合
  17.   (setq zuhe (mapcar '(lambda(x y ) (strcat x y)) ( reverse _biglst) _bigunit))
  18.   ;;;;处理与零组合的情况
  19.   (setq chuli1 (mapcar '(lambda(x) (if (wcmatch x "零千,零百,零十") "零"  
  20.            (if (wcmatch x "零万,零亿") (vl-string-trim "零" x) x )) ) zuhe))
  21.   ;;;;处理从个位开始是0的
  22.   (while (and (> (length chuli1) 1)(wcmatch (car chuli1) "零*"))
  23.     (setq chuli1  (cdr chuli1))
  24.   )
  25.   ;;;;连接处理过后的组合
  26.   (setq chuli2 (apply 'strcat (reverse chuli1)))
  27.   (cond
  28.     ((wcmatch chuli2 "*零零零零亿*")(setq chuli2(vl-string-subst "" "零零零零亿" chuli2)))
  29.     ((wcmatch chuli2 "*零零零亿*")(setq chuli2(vl-string-subst "亿" "零零零亿" chuli2)))
  30.     ((wcmatch chuli2 "*零零亿*")(setq chuli2(vl-string-subst "亿" "零零亿" chuli2)))
  31.     ((wcmatch chuli2 "*零亿*")(setq chuli2(vl-string-subst "亿" "零亿" chuli2)))
  32.   )
  33.   (cond
  34.     ((wcmatch chuli2 "*零零零万*")(setq chuli2(vl-string-subst "" "零零零万" chuli2)))
  35.     ((wcmatch chuli2 "*零零万*")(setq chuli2(vl-string-subst "万" "零零万" chuli2)))
  36.     ((wcmatch chuli2 "*零万*")(setq chuli2(vl-string-subst "万" "零万" chuli2)))
  37.   )
  38.   (while (wcmatch chuli2 "*零零*")
  39.    (setq chuli2 (vl-string-subst "零" "零零" chuli2))
  40.   )
  41.   (if (wcmatch chuli2 "一十*")
  42.    (setq chuli2 (vl-string-subst "十" "一十" chuli2))
  43.   )
  44.   chuli2
  45. )



评分

参与人数 4明经币 +4 收起 理由
pzweng + 1 很给力!
tryhi + 1 赞一个!
叮咚 + 1
jltx123456 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-6-25 17:01 | 显示全部楼层
本帖最后由 黄翔 于 2024-6-25 17:14 编辑

无聊.按照楼主的也写了一个
;因为(vl-string-trim  "零" "六")有bug.不使用vl-string-trim函数..
  1. (defun toChineseNum(str / n  numChineseLst result s0 s1 strLst x y)     
  2.    (setq s0 '( "零""一""二""三""四""五""六""七""八""九" ))
  3.    (setq strLst(mapcar '(lambda(x)(nth(- x 48)s0))(vl-string->list str)))           
  4.    (setq s1 '("""十""百""千""万""十""百""千""亿""十""百""千""万""十""百""千""万万""十""百""千""万""十""百""千""万万"))         
  5.    (setq result (apply 'strcat(mapcar '(lambda(x y)
  6.        (cond((and (= x "零")(member y '("十""百""千")))"零")((and (= x "零")(member y '("万""亿" ))) y)(t (strcat x y)))
  7.      ) strLst (reverse(mapcar '(lambda(x y) y)  strLst  s1)))))
  8.     (while(vl-string-search "零零" result)(setq result (vl-string-subst "零" "零零" result)))
  9.     (if (wcmatch result "*?零") (setq result (substr result 1 (- (strlen result)2))))
  10.     result
  11. )

  (mapcar 'toChineseNum '("2055014010" "20001" "20010" ))  
   ==>("二十亿五千五百零一万四千零一十" "二万零一" "二万零一十")

评分

参与人数 3明经币 +3 收起 理由
hubeiwdlue + 1 很给力!
pzweng + 1 很给力!
tryhi + 1 赞一个!

查看全部评分

发表于 2024-6-26 10:19 | 显示全部楼层
大佬活跃起来了,点赞
发表于 2024-6-26 10:32 | 显示全部楼层
本帖最后由 tryhi 于 2024-6-26 10:41 编辑

咱也来一个吧
  1. ;;将数字转换为汉字,仅支持到万亿,只支持整数
  2. (defun num2str(num / charofcash i n tempa tempstr)
  3.         (setq s0 '( "零""一""二""三""四""五""六""七""八""九" ))
  4.         (setq s1 '("""十""百""千""万""十""百""千""亿""十""百""千""万"))  
  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.                 (setq TempStr (nth (atoi TempStr) s0))
  12.                 (if (/= "零" TempStr)
  13.                         (setq TempStr (strcat TempStr (nth i s1)))
  14.                 )
  15.                 (setq tempa(substr CharOfCash  1 2))
  16.                 (if (or (/= TempStr "零")(not(or (wcmatch tempa "零,万,亿")(= tempa ""))))
  17.                         (setq CharOfCash(strcat TempStr CharOfCash))
  18.                 )
  19.         )
  20.         (setq temp(substr CharOfCash 1 4))
  21.         (if (= "一十"temp)(substr CharOfCash 3)CharOfCash);去掉一十
  22. )

  23. (num2str 5012500030101)
  24. ;===>"五万零一百二十五亿零三万零一百零一"

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


另外还有一个汉字转数字的函数 [源码]数字转为汉字函数、汉字数字互转
(str2num "一千零八十万八千七百六十七")
;==> 10808767

评分

参与人数 2明经币 +2 收起 理由
hubeiwdlue + 1 很给力!
pzweng + 1 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-28 23:14 , Processed in 0.207633 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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