明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1690|回复: 6

[源码] 阿拉伯数字与中文数字互转

[复制链接]
发表于 2023-5-9 16:59:16 | 显示全部楼层 |阅读模式
三个函数
1、正则表达式;
2、阿拉伯数字转中文数字;
3、中文数字转阿拉伯数字。
有需求自取!!!


  1. ;;;公共函数库-字符串操作
  2. ;;;目录
  3. ;;;1、正则表达式:L-string-regex(str1 str2 global ignorecase method pattern)
  4. ;;;2、集合转列表:convert-IMatchCollection-to-list
  5. ;;;3、阿拉伯数字转汉字数字:L-string-arabictocn
  6. ;;;4、中文数字转阿拉伯数字:L-string-cntoarabic
  7. ;;;

  8. ;;;-----------------------------------------------------------;;
  9. ;;; 正则表达式                                                               ;;
  10. ;;; L-string-regex                                            ;;
  11. ;;; 输入:
  12. ;;; str___字符串
  13. ;;; global___1 or 0, 指明模式是匹配整个字符串中所有与之相符的地方还是只匹配第一次出现的地方。
  14. ;;; ignorecase___1 or 0, 指明模式匹配是否大小写敏感。
  15. ;;; method___"Execute"、"Replace"、"Test"
  16. ;;; pattern___正则表达式
  17. ;;; 输出:列表、字符串、bool
  18. ;;; 示例:
  19. ;;; (setq str "liguiming1234567890" global 1 ignorecase 1 method "Execute")
  20. ;;; (L-string-regex "liguiming1234567890" 1 1 "Execute" "")
  21. ;;;-----------------------------------------------------------;;
  22. (defun L-string-regex(str1 str2 global ignorecase method pattern)
  23.         (VL-LOAD-COM)
  24.         ;;引用正则表达式控件
  25.         (setq regex (vlax-create-object "Vbscript.RegExp"))
  26.         (vlax-put-property regex "Global" global)
  27.         (vlax-put-property regex "IgnoreCase" ignorecase)
  28.         (vlax-put-property regex "Pattern" pattern)
  29.         (cond
  30.                 ((= method "Execute") (vlax-invoke-method  regex method str1))
  31.                 ((= method "Replace") (vlax-invoke-method  regex method str1 str2))
  32.                 ((= method "Test") (vlax-invoke-method  regex method str1))
  33.                 (t nil)
  34.         )
  35.        
  36. )


  37. (defun convert-IMatchCollection-to-list (matches)
  38.   (setq l (list))
  39.   (setq i 0)
  40.   (while (< i (vlax-get-property matches 'Count))
  41.     (setq l (cons (vlax-get-property matches 'Item i) l))
  42.     (setq i (1+ i))
  43.   )
  44.   l
  45. )

  46. ;;;-----------------------------------------------------------;;
  47. ;;; 阿拉伯数字转中文数字                                                   
  48. ;;; L-string-arabictocn                                            
  49. ;;; 输入:整数
  50. ;;; 输出:中文数字字符串
  51. ;;; 示例:
  52. (defun L-string-arabictocn (arabic / cn weight digits units section section-units z arabic)
  53. ; 保存转换后的中文数字
  54. (setq cn "")
  55. ; 当前位的权重
  56. (setq weight 1)
  57. ; 中文数字的字符串数组
  58. (setq digits '("零" "一" "二" "三" "四" "五" "六" "七" "八" "九"))
  59. ; 中文数字的单位字符串数组
  60. (setq units '("" "十" "百" "千"))
  61. ; 中文数字的节权位符字符串数组
  62. (setq section-units '("" "万" "亿"))
  63. ; 当前处理的节的编号
  64. (setq section 0)
  65. (setq z 0)
  66. (while (/= arabic 0)
  67.         ; 获取当前数字的个位数
  68.         (setq digit (rem arabic 10))
  69.         ; 将当前数字缩小 10 倍,准备处理下一个数字
  70.         (setq arabic (fix (/ arabic 10)))
  71.         (if (= weight 1) (progn (setq cn (strcat (nth section section-units) cn)) (setq section (1+ section))))
  72.         (cond
  73.                 ((= digit 0)
  74.                         ; 如果前面还没有数字或前面的数字是零或当前处理的数字是节权位符
  75.                         (if (and (/= (substr cn 1 1) "零") (/= z 0))
  76.                                 ; 在结果前面加上零
  77.                                 (progn (setq cn (strcat (nth 0 digits) cn) ) (setq z 0))
  78.                         )
  79.                 )
  80.                 ; 否则在结果前面加上当前数字和单位
  81.                 (t (progn (setq cn (strcat (nth digit digits) (nth (fix (+ (/ (log weight) (log        10)) 0.5)) units) cn)) (setq z 1)))
  82.         )
  83.         (setq weight (if (= weight 1000) (progn (setq z 0 ) 1) (* weight 10))) ; 更新当前位的权重
  84. )
  85. ; 十位处理
  86. (if (=(L-string-regex cn "" 1 1 "Test" "一十") :vlax-true) (L-string-regex cn "十" 0 1 "Replace" "一十"))
  87. )


  88. ;;;-----------------------------------------------------------;;
  89. ;;; 中文数字转阿拉伯数字                                                
  90. ;;; L-string-cntoarabic                                          
  91. ;;; 输入:中文数字字符串
  92. ;;; 输出:整数
  93. ;;; 示例:
  94. (defun L-string-cntoarabic(cn / ch-num arabic-num bit-units units section-units section bitvalue weight result i j cn)
  95.   (setq ch-num "零一二三四五六七八九")
  96.   (setq arabic-num '(0 1 2 3 4 5 6 7 8 9))
  97.   (setq bit-units "十百千")
  98.   (setq units '(10 100 1000))
  99.   (setq section-units "万亿")
  100.   (setq section '(10000 100000000))
  101.   (setq bitvalue 1)
  102.   (setq weight 1)
  103.   (setq result 0)
  104.   (if (= (L-string-regex cn "" 1 1 "Test" "^十") :vlax-true) (setq cn (L-string-regex cn "一十" 0 1 "Replace" "十")))
  105.   (setq i 0)
  106.   (setq j 0)
  107.   (while (and (setq c1 (nth j (reverse (vl-string->list cn)))) (setq c2 (nth (1+ j) (reverse (vl-string->list cn)))))
  108.           (cond
  109.                   ((and (vl-string-position c1 ch-num) (setq i (vl-string-position c2 ch-num)))
  110.                                   (progn
  111.                                           (if (= (rem i 2) 0)
  112.                                                   (progn
  113.                                                           (setq i (/ i 2))
  114.                                                           (setq result (+ result (* (* (nth i arabic-num) bitvalue) weight) ))
  115.                                                   )
  116.                                           )
  117.                                   )
  118.                   )
  119.                   ((and (vl-string-position c1 bit-units) (setq i (vl-string-position c2 bit-units)))
  120.                                   (progn
  121.                                           (if (= (rem i 2) 0)
  122.                                                   (progn
  123.                                                           (setq i (/ i 2))
  124.                                                           (setq bitvalue (nth i units))
  125.                                                   )
  126.                                           )
  127.                                   )
  128.                   )
  129.                   ((and (vl-string-position c1 section-units) (setq i (vl-string-position c2 section-units)))
  130.                             (progn
  131.                                     (if (= (rem i 2) 0)
  132.                                                   (progn
  133.                                                           (setq i (/ i 2))
  134.                                                           (setq weight (nth i section))
  135.                                                           (setq bitvalue 1)
  136.                                                   )
  137.                                           )
  138.                                   )
  139.                   )
  140.                   (t nil)
  141.           )
  142.           (setq j (+ j 2))
  143.   )
  144.   result
  145. )




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +2 金钱 +5 收起 理由
tigcat + 1 + 5 谢谢楼主分享.
ptime + 1

查看全部评分

发表于 2023-5-9 17:20:26 | 显示全部楼层
(L-string-cntoarabic "一千零八十万八千七百六十七")
试了结果不对,返回10808707

试试我的汉字、数字互转函数
http://bbs.mjtd.com/thread-169872-1-1.html

如果缺少try-StrRegExpReplace、try-StrRegExp函数的话:
http://bbs.mjtd.com/thread-169835-1-1.html
 楼主| 发表于 2023-5-9 22:35:12 | 显示全部楼层
感谢大佬指出错误,已初步测试,应该没啥问题了

  1. ;;;公共函数库-字符串操作
  2. ;;;目录
  3. ;;;1、正则表达式:L-string-regex(str1 str2 global ignorecase method pattern)
  4. ;;;2、集合转列表:convert-IMatchCollection-to-list
  5. ;;;3、阿拉伯数字转汉字数字:L-string-arabictocn
  6. ;;;4、中文数字转阿拉伯数字:L-string-cntoarabic
  7. ;;;

  8. ;;;-----------------------------------------------------------;;
  9. ;;; 正则表达式                                                               ;;
  10. ;;; L-string-regex                                            ;;
  11. ;;; 输入:
  12. ;;; str___字符串
  13. ;;; global___1 or 0, 指明模式是匹配整个字符串中所有与之相符的地方还是只匹配第一次出现的地方。
  14. ;;; ignorecase___1 or 0, 指明模式匹配是否大小写敏感。
  15. ;;; method___"Execute"、"Replace"、"Test"
  16. ;;; pattern___正则表达式
  17. ;;; 输出:列表、字符串、bool
  18. ;;; 示例:
  19. ;;; (setq str "liguiming1234567890" global 1 ignorecase 1 method "Execute")
  20. ;;; (L-string-regex "liguiming1234567890" 1 1 "Execute" "")
  21. ;;;-----------------------------------------------------------;;
  22. (defun L-string-regex(str1 str2 global ignorecase method pattern)
  23.         (VL-LOAD-COM)
  24.         ;;引用正则表达式控件
  25.         (setq regex (vlax-create-object "Vbscript.RegExp"))
  26.         (vlax-put-property regex "Global" global)
  27.         (vlax-put-property regex "IgnoreCase" ignorecase)
  28.         (vlax-put-property regex "attern" pattern)
  29.         (cond
  30.                 ((= method "Execute") (vlax-invoke-method  regex method str1))
  31.                 ((= method "Replace") (vlax-invoke-method  regex method str1 str2))
  32.                 ((= method "Test") (vlax-invoke-method  regex method str1))
  33.                 (t nil)
  34.         )
  35.        
  36. )


  37. (defun convert-IMatchCollection-to-list (matches)
  38.   (setq l (list))
  39.   (setq i 0)
  40.   (while (< i (vlax-get-property matches 'Count))
  41.     (setq l (cons (vlax-get-property matches 'Item i) l))
  42.     (setq i (1+ i))
  43.   )
  44.   l
  45. )

  46. ;;;-----------------------------------------------------------;;
  47. ;;; 阿拉伯数字转中文数字                                                   
  48. ;;; L-string-arabictocn                                            
  49. ;;; 输入:整数
  50. ;;; 输出:中文数字字符串
  51. ;;; 示例:
  52. (defun L-string-arabictocn (arabic / cn weight digits units section section-units z arabic)
  53. ; 保存转换后的中文数字
  54. (setq cn "")
  55. ; 当前位的权重
  56. (setq weight 1)
  57. ; 中文数字的字符串数组
  58. (setq digits '("零" "一" "二" "三" "四" "五" "六" "七" "八" "九"))
  59. ; 中文数字的单位字符串数组
  60. (setq units '("" "十" "百" "千"))
  61. ; 中文数字的节权位符字符串数组
  62. (setq section-units '("" "万" "亿"))
  63. ; 当前处理的节的编号
  64. (setq section 0)
  65. (setq z 0)
  66. (while (/= arabic 0)
  67.         ; 获取当前数字的个位数
  68.         (setq digit (rem arabic 10))
  69.         ; 将当前数字缩小 10 倍,准备处理下一个数字
  70.         (setq arabic (fix (/ arabic 10)))
  71.         (if (= weight 1) (progn (setq cn (strcat (nth section section-units) cn)) (setq section (1+ section))))
  72.         (cond
  73.                 ((= digit 0)
  74.                         ; 如果前面还没有数字或前面的数字是零或当前处理的数字是节权位符
  75.                         (if (and (/= (substr cn 1 1) "零") (/= z 0))
  76.                                 ; 在结果前面加上零
  77.                                 (progn (setq cn (strcat (nth 0 digits) cn) ) (setq z 0))
  78.                         )
  79.                 )
  80.                 ; 否则在结果前面加上当前数字和单位
  81.                 (t (progn (setq cn (strcat (nth digit digits) (nth (fix (+ (/ (log weight) (log        10)) 0.5)) units) cn)) (setq z 1)))
  82.         )
  83.         (setq weight (if (= weight 1000) (progn (setq z 0 ) 1) (* weight 10))) ;更新当前位的权重
  84. )
  85. ; 十位处理
  86. (if (=(L-string-regex cn "" 1 1 "Test" "^一十") :vlax-true) (setq cn (L-string-regex cn "十" 0 1 "Replace" "一十")))
  87. cn
  88. )


  89. ;;;-----------------------------------------------------------;;
  90. ;;; 中文数字转阿拉伯数字                                                
  91. ;;; L-string-cntoarabic                                          
  92. ;;; 输入:中文数字字符串
  93. ;;; 输出:整数
  94. ;;; 示例:
  95. (defun L-string-cntoarabic(cn / ch-num arabic-num bit-units units section-units section bitvalue weight result i j cn)
  96.   (setq ch-num "零一二三四五六七八九")
  97.   (setq arabic-num '(0 1 2 3 4 5 6 7 8 9))
  98.   (setq bit-units "十百千")
  99.   (setq units '(10 100 1000))
  100.   (setq section-units "万亿")
  101.   (setq section '(10000 100000000))
  102.   (setq bitvalue 1)
  103.   (setq weight 1)
  104.   (setq result 0)
  105.   (if (= (L-string-regex cn "" 1 1 "Test" "^十") :vlax-true) (setq cn (L-string-regex cn "一十" 0 1 "Replace" "十")))
  106.   (setq i 1)
  107.   (while (/= (setq c1 (substr (L-string-reverse cn) i 2)) "")
  108.           (cond
  109.                   ((setq n (L-string-position ch-num c1))
  110.                           (setq result (+ result (* (* (nth n arabic-num) bitvalue) weight) ))
  111.                   )
  112.                   ((setq n (L-string-position bit-units c1))
  113.                                 (setq bitvalue (nth n units))
  114.                   )
  115.                   ((setq n (L-string-position section-units c1))
  116.                                   (setq weight (nth n section))
  117.                                   (setq bitvalue 1)
  118.                   )
  119.                   (t nil)
  120.           )
  121.           (setq i (+ i 2))
  122.   )
  123.   result
  124. )

  125. ;;;-----------------------------------------------------------;;
  126. ;;; 判断字符在字符串中的位置(中文字符占位调整为1位)                                                
  127. ;;; L-string-position                                          
  128. ;;; 输入:
  129. ;;; 输出:
  130. ;;; 示例:
  131. (defun L-string-position(str s / i n loop)
  132.         (setq i 1)
  133.         (setq n 0)
  134.         (setq loop t)
  135.         (while loop
  136.                 (cond
  137.                         ((> i (strlen str)) (setq loop nil)(setq n nil))
  138.                         ((>= (ascii (substr str i 1)) 128)
  139.                                 (if (= (substr str i 2) s)
  140.                                         (setq loop nil)
  141.                                         (progn (setq i (+ i 2)) (setq n (1+ n)))
  142.                                 )
  143.                         )
  144.                         (t
  145.                                 (if (= (substr str i 1) s)
  146.                                         (setq loop nil)
  147.                                         (progn (setq i (+ i 1)) (setq n (1+ n)))
  148.                                 )
  149.                         )
  150.                 )
  151.         )
  152.         n
  153. )

  154. ;;;-----------------------------------------------------------;;
  155. ;;; 字符串的元素顺序倒置后返回                                             
  156. ;;; L-string-position                                          
  157. ;;; 输入:
  158. ;;; 输出:
  159. ;;; 示例:
  160. (defun L-string-reverse(str / i res loop)
  161.         (setq i 1)
  162.         (setq res "")
  163.         (setq loop t)
  164.         (while loop
  165.                 (cond
  166.                         ((> i (strlen str)) (setq loop nil))
  167.                         ((>= (ascii (substr str i 1)) 128)
  168.                                 (setq res (strcat (substr str i 2) res))
  169.                                 (setq i (+ i 2))
  170.                         )
  171.                         (t
  172.                                         (setq res (strcat (substr str i 1) res))
  173.                                         (setq i (+ i 1))
  174.                         )
  175.                 )
  176.         )
  177.         res
  178. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1 赞一个!

查看全部评分

发表于 2023-5-10 00:33:38 | 显示全部楼层
今天 刚刚好天报销单用到数字转中文大写。可以参考下
发表于 2023-5-30 22:21:02 | 显示全部楼层
函数快捷键是什么,是需要再前面加快捷键函数吗?
发表于 2023-5-31 11:49:36 | 显示全部楼层
不错,留个脚印
发表于 2023-6-19 14:51:03 | 显示全部楼层
danier 发表于 2023-5-9 22:35
感谢大佬指出错误,已初步测试,应该没啥问题了

只会用lisp的,这种要怎么加载使用呀?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 20:34 , Processed in 0.185198 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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