找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31151|回复: 8

[问题求助] [已解决]VBS如何实现将中文小写数字转换成阿拉伯数字

[复制链接]
发表于 2014-7-7 18:30:08 | 显示全部楼层 |阅读模式
有大量文本,比如把VBS放在文件夹,一次全部处理,弄成4位的数字。
这些是文本第一行提取的内容,内容有第一节,第二节,第三节……第一千零三十节……
需要处理成第0001节,第0002节,第0003节……第1030节……
而不用处理这类内容:今天考试得了第一,课堂上老师表扬了我。

小写数字转换大写方面能对就好了,
第二个问题是有的是【0001】,【0002】,【0003】……
怎么在这样的内容前面加个第字变成第0001章,第0002章,第0003章……
发表于 2014-7-7 22:20:11 | 显示全部楼层
本帖最后由 CrLf 于 2014-7-16 16:56 编辑

一个示例:
  1. MsgBox [大写数字转阿拉伯数字]("第一千零三十节")

  2. Function [大写数字转阿拉伯数字]([原始字符串])
  3.         Dim [大写数字],[数字列表]
  4.        
  5.         [大写数字] = reReplace([原始字符串],"^[^零一二三四五六七八九十百千两]*","")
  6.         [大写数字] = reReplace([大写数字],"[^零一二三四五六七八九十百千两].*","")
  7.         [原始字符串] = reReplace([原始字符串],"[零一二三四五六七八九十百千两]+","#")
  8.        
  9.         [数字列表]="零一二三四五六七八九"
  10.         For i=0 To Len([数字列表])
  11.                 [大写数字]=Replace([大写数字],Mid([数字列表],i+1,1),"+"&i)
  12.         Next
  13.         [大写数字]=Replace([大写数字],"两","+2")
  14.        
  15.         [大写数字] = Replace([大写数字],"十","*10")
  16.         [大写数字] = Replace([大写数字],"百","*100")
  17.         [大写数字] = Replace([大写数字],"千","*1000")
  18.         [大写数字] = Mid([大写数字],2)
  19.         [大写数字转阿拉伯数字] = Replace([原始字符串],"#",Eval([大写数字]))
  20. End Function

  21. Function reReplace(string1,pattern,string2)
  22.         With New RegExp
  23.                 .Pattern=pattern
  24.                 reReplace=.Replace(string1,string2)
  25.         End With
  26. End Function
复制代码

评分

参与人数 1技术 +1 收起 理由
xp3000 + 1 这个不知道怎么搞不定,凡是正则表达式后面 ...

查看全部评分

 楼主| 发表于 2014-7-8 09:22:06 | 显示全部楼层
大量TXT首行提取的内容如下,测试了下不能成功:
第一节
第二节
第三节
第四节
第五节
第六节
第七节
第八节
第九节
第十节
发表于 2014-7-8 09:58:15 | 显示全部楼层
回复 3# xp3000


    给一个测试样本,具体说明需要修改成什么样子
 楼主| 发表于 2014-7-8 12:15:20 | 显示全部楼层
样本已经发了,有两个需要处理
发表于 2014-7-8 14:13:09 | 显示全部楼层
本帖最后由 apang 于 2014-7-8 14:14 编辑
  1. Dim str, fso, file, f, txt
  2. str = "零一二三四五六七八九十百千"
  3. Set fso = CreateObject("Scripting.FileSystemObject")
  4. For Each file in fso.GetFolder(".").Files
  5.     If LCase(Right(file, 4)) = ".txt" Then
  6.         Set f = fso.OpenTextFile(file, 1)
  7.         txt = f.ReadAll
  8.         f.Close : Set f = Nothing
  9.         fso.OpenTextFile(file, 2).Write RegEx(txt)
  10.     End If
  11. Next
  12. Set fso = Nothing

  13. MsgBox "OK"

  14. Function RegEx(txt)
  15.     Dim re, s, i, s1, ss
  16.     Set re = New RegExp
  17.     re.Pattern = "(第)([" & str & "]+)(节)"
  18.     If Not re.Test(txt) Then RegEx = txt : Exit Function
  19.     s = re.Execute(txt)(0).SubMatches(1)
  20.     If Left(s, 1) = "十" Then s = "一" & s
  21.     For i = 1 to Len(s)
  22.         s1 = Mid(s, i, 1)
  23.         If InStr(str, s1) > 10 Then
  24.             ss = ss & "*10^" & (InStr(str, s1)-10) & "+"
  25.         Else ss = ss & (InStr(str, s1)-1)
  26.         End If
  27.     Next
  28.     s = Right("0000" & eval(ss & "+0"), 4)
  29.     RegEx = re.Replace(txt, "$1" & s & "$3")
  30. End Function
复制代码
第2个,把function部分换成:
  1. Function RegEx(txt)
  2.     Dim re, s
  3.     Set re = New RegExp
  4.     re.Pattern = "【(\d+)】"
  5.     If Not re.Test(txt) Then RegEx = txt : Exit Function
  6.     s = re.Execute(txt)(0).SubMatches(0)
  7.     s = Right("0000" & s, 4)
  8.     RegEx = re.Replace(txt, "第" & s & "节")
  9. End Function
复制代码
 楼主| 发表于 2014-7-16 16:31:14 | 显示全部楼层
回复 6# apang


    不好意思电脑雷给劈了现在才弄好,发现带有第两百字样的章不能转换
发表于 2014-7-16 16:57:04 | 显示全部楼层
已修改
发表于 2014-7-16 19:20:28 | 显示全部楼层
回复 7# xp3000


    第19行:
  1. re.Pattern = "(第)([" & str & "两]+)(节)"
复制代码
第21行:
  1. s = re.Execute(txt)(0).SubMatches(1) : s = Replace(s, "两", "二")
复制代码
话说测试样本中没见到“两”字
108 可以叫 一百单八,可以叫 百又八,可以叫 一百零八,等
总之中文数字叫法很多,如果要求代码兼容所有叫法,估计有难度,具体问题具体分析吧

评分

参与人数 1技术 +1 收起 理由
xp3000 + 1 乐于助人

查看全部评分

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:32 , Processed in 0.012569 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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