分享

人民币大写转换函数

 庋藏天下 2012-09-18
Function N2RMB(M)
    y = Int(Round(100 * Abs(M)) / 100)
    j = Round(100 * Abs(M) + 0.00001) - y * 100
    f = (j / 10 - Int(j / 10)) * 10
    A = IIf(y < 1, "", Application.Text(y, "[DBNum2]") & "元")
    b = IIf(j > 9.5, Application.Text(Int(j / 10), "[DBNum2]") & "角", IIf(y < 1, "", IIf(f > 1, "零", "")))
    c = IIf(f < 1, "整", Application.Text(Round(f, 0), "[DBNum2]") & "分")
    N2RMB = IIf(Abs(M) < 0.005, "", IIf(M < 0, "负" & A & b & c, A & b & c))
End Function

另外一个函数:
Function dx(M) '一条语句163个字符
    dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;负 0. 0 0;   ")), ["[DBnum2]"&{0,"","元0角;;元零","0分;;整"}]), a), "零元零", a), "零元", a), "零整", "整")
End Function
代码解析:
代码中使用了Replace()、Join()、Split()、Format()等4个VBA函数,以及1个工作表函数Text()。

Join()函数:返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。这与Split函数的作用完全相反。
格式:Join(list[,delimiter])
list:必需的。包含被连接子字符串的一维数组。
delimiter:可选的。在返回字符串中用于分隔子字符串的字符。如果忽略该项,则使用空格来分隔子字符串。如果该项是零长度字符串(""),则返回的字符串中,各子串之间没有分隔符。
代码中用变量a代替Join()的第二参数。因a的初始值为空,故此参数为空字符(""),表明返回的字符串中,各子串间无分隔。
例如:
Join([{"Join","using","spaces"}]) 返回结果是:"Join using spaces"
Join([{"Join","using","emptys"}], a) 返回结果是:"Joinusingemptys"

Split()函数:返回一个下标从零开始的一维数组,它包含指定数目的子字符串。
格式:Split(expression[,delimiter[,limit[,compare]]])
expression:必需的。包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串(""),Split则返回一个空数组,即没有元素和数据的数组。
delimiter:可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符(" ")作为分隔符。如果delimiter是一个长度为零的字符串,则返回的数组仅包含一个元素,即完整的expression字符串。
limit:可选的。要返回的子字符串数,忽略则默认-1,表示返回所有的子字符串。
compare:可选的。数字值,表示判别子字符串时使用的比较方式。忽略则默认1,执行文字比较。

Format()函数:根据有效的命名表达式来对指定的表达式进行格式化。
格式:Format(expression[, format[, firstdayofweek[, firstweekofyear]]])
各参数含义如下:
expression:必要参数。任何有效的表达式。
format:可选参数。有效的命名表达式或用户自定义格式表达式。
firstdayofweek:可选参数。常数,表示一星期的第一天。
firstweekofyear:可选参数。常数,表示一年的第一周。

代码中format函数的第二参数是" 0. 0 0;负 0. 0 0;   ",格式中的0为占位符,每个0前边都有一个空格,第二个分号(;)后边有三个空格。第一个0表示整数部分的数字,第二个0表示小数十分位数字,第三个0表示小数百分位数字。第一个0前边的空格,表示这个空格前边还有一个空字符chr(0),换句话说,也就是空字符与整数数字之间有一个空格;第二个0前边的空格,表示整数数字与十分位数字之间有一个空格;第三个0前边的空格,表示十分位数字与百分位数字之间有一个空格。格式字串由分号(;)分成3段,第一段为M>0时的格式,第二段为M<0时的格式,比如-10.2将被格式化为“负 10. 2 0”;第三段为M=0时的格式,这里用3个空格代替,其目的是将四个空字符(由这3个空格分隔的)送到数字数组中。这里,Format 函数的参数居然和Text函数类似,也可以体现“正负零”3种状态(text是“正负零文本”4种状态),但不支持条件参数。
例如:
若M=123.09,则:
format(M," 0. 0 0;负 0. 0 0;   ")=" 123. 0 9"
Split(Format(M, " 0. 0 0;负 0. 0 0;   "))={"",123,0,9}
上式中,因各子串之间是由空格分隔的,所以Split()的第二参数可省略,即默认分隔符为空格。
若M=-123.09,则:
format(M," 0. 0 0;负 0. 0 0;   ")="负 123. 0 9"
Split(Format(M, " 0. 0 0;负 0. 0 0;   "))={"负",123,0,9}

代码中工作表函数Text()第一参数是数组,第二参数(即格式参数)也是数组。两个数组中的元素是逐一对应的关系。花括号{}表示工作表常量数组,方括号[]在这里表示VBA的常量数组。实际上,表达式["[DBnum2]"&{0, "", "元0角;;元零", "0分;;整"}]的计算结果即为{"[DBnum2]0", "[DBnum2]", "[DBnum2]元0角;;元零", "[DBnum2]0分;;整"}。

表达式Text(Split(Format(M, " 0. 0 0;负 0. 0 0;   ")), ["[DBnum2]"&{0,"","元0角;;元零","0分;;整"}])   属于Text()函数的高级应用,
可用3列纵向数组表示如下:
若M = 123.09                                                                                   若M = ─0.05
数字数组         格式数组                             Text()返回结果数组        数字数组         格式数组                              Text()返回结果数组
(空字符)        "[DBnum2]0"                        (空字符)                          负                  "[DBnum2]0"                         负
123               "[DBnum2]"                          壹佰贰拾叁                      0                   "[DBnum2]"                           零
0                   "[DBnum2]元0角;;元零"        元零                                0                   "[DBnum2]元0角;;元零"         元零
9                   "[DBnum2]0分;;整"               玖分                                5                   "[DBnum2]0分;;整"                伍分

然后用Join()函数将结果数组连接起来。Join()的第二参数用变量a代替,变量a的初始值为空,表示子串之间无分隔。
当M=123.09,则Join后的大写金额为“壹佰贰拾叁元零玖分”,
当M=─0.05,则Join后的大写金额为“负零元零伍分”。
最后,将不符合大写规则的“零元零”、“零元”替换为空,将“零整”替换为“整”。
若源数据M=0,则大写结果显示为空白。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多