公式并非本人制作,此为本人学习及理解日记。
总之,先粘贴具体实现公式:
=SUBSTITUTE(SUBSTITUTE(IF(F9<0,"负","")&TEXT(TRUNC(ABS(ROUND(F9,2))),"[DBNum2]")&"圆"&IF(ISERR(FIND(".",ROUND(F9,2))),"",TEXT(RIGHT(TRUNC(ROUND(F9,2)*10)),"[DBNum2]"))&IF(ISERR(FIND(".0",TEXT(F9,"0.00"))),"角","")&IF(LEFT(RIGHT(ROUND(F9,2),3))=".",TEXT(RIGHT(ROUND(F9,2)),"[DBNum2]")&"分",IF(ROUND(F9,2)=0,"","整")),"零圆零",""),"零圆","")
解析公式前,先了解其中用到的一些函数。
substitute函数 作用为 替换单元格内的字符串,可指定。
公式如下:=substitute(text“要替换的值,可指定单元格”,old_text“要被替换的旧字符串”,new_text“新的字符串内容”,[instance_num]“指定更换字符串的位置,如果不写则默认全转换”)
一般用于大部分格式相同时的单元格值替换,其实跟Ctrl+H的效果差不多,不过函数胜在可以嵌套使用,例子如下:

text函数 作用为 将数值格式的内容 替换为 文本型格式的内容。
公式如下: =text(value“要替换的值,可指定单元格”,format_text“指定新的格式,等同于自定义格式”)
一般可以用来规范文本或者设置特定的日期显示格式以及增加特定的符号等,例子如下:

trunc函数 作用为 直接截取数值型内容。
公式如下:=trunc(number“要替换的数值,可指定单元格,限定数值型单元格”,number_digits“可指定位数,不填则默认为0”)
这个函数的概念不存在四舍五入,如同字符串一般只会直接截取,例子如下:

abs函数 作用为 将带有符号的数值替换为绝对的数值型内容。
公式如下:=abs(number“用于设置公式,也可不设置”)
例子如下:

[DBNum2]函数 作用为 excel内建函数,将数字转换为中文大写。
相同效果但显示不同的内建函数还有[DBNum1],[DBNum3]
一般嵌合在其他函数内使用,比如text函数。
公式如下:=text(value,[DBNum2])
例子如下:

iserr函数 作用为 检测除#N/A以外的错误值。
公式如下:=iserr(value“指定单元格,也可嵌套函数”)
一般嵌合在其他函数内使用,比如if函数。
例子如下:

公式解析:

当数字为负数时,则在繁体汉字前追加“负”字,否则不添加。用abs函数将文本型数值替换成数值型数值,再用trunc函数直接截取整数后,使用text函数将数值替换成繁体大写。

将“角”这一位数单独处理。
使用find函数找出单元格内的数值是否具有“.”这一符号。
如果有则显示值为错误并进入错误的分支项,在错误的分支项中使用(round函数*10)将“角”这一位数提取成为整数,并用trunc函数提取所有整数。
再用right函数从右边提取第一位数,通过text函数将此数值替换成为繁体大写。
后面的单位通过if和iserr函数的嵌合判断“.”后面是否为零,如果不为零则使用单位“角”,为零则什么都不操作。
最后通过&符号将繁体大写和单位连接在一起。

将“分”这一位数单独处理。
因为繁体大写一般不会使用到小数点后面三位或者更多位数,所以通过round函数将数值限定成两位小数。
PS.此函数支持四舍五入算法。
紧接着,使用right函数提取从右边数起第三个字符串,将这个位置的字符串作为left函数的第一起始点。
如果left函数提取的这个字符串刚好等于“.”,进入正确的分支项,使用right函数提取右边数起第一个数字。
PS.需使用round函数将数值限定成两位小数。
提取出数字后,使用text函数将其转换成大写,并通过&符号直接连接单位“分”。
如果left函数提取的这个字符串不等于“.”则进入错误的分支项,通过if函数和round函数的嵌合使用判断“分”这个位置是否具有数值,如果不具有直接进入错误的分支项。
至此,公式主要部分已经解释完毕,剩下后面的部分纯属画龙点睛之作,其实可要,亦可不要。
网友评论