ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: ldy

[分享]人民币大写函数TEXT终极版 1行(136字符)

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-10 17:54 | 显示全部楼层
本帖已被收录到知识树中,索引项:数据格式转换

谢谢 shun2233 参与,不过都错了

172 148  错  0.999   壹零角整

179      错    0.999   整

TA的精华主题

TA的得分主题

发表于 2008-8-10 18:13 | 显示全部楼层

参照版主的修正了,还是版主的公式精简

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(A3<0,"负",)&TEXT(INT(ABS(ROUND(A3,2))),"[dbnum2];; ")&TEXT(--RIGHT(RMB(A3),2),"[>9][dbnum2]元0角0分;[=0]元整;[dbnum2]元零0分"),"零分","整")," 元零",)," 元",)

[此贴子已经被作者于2008-8-10 18:18:13编辑过]

TA的精华主题

TA的得分主题

发表于 2008-8-10 21:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

一亿以内,绝对值0.005以上:不知这个能否算并加分加精呢

123个字符: (经过刀砍斧削又减少了10个字符)
=SUBSTITUTE(SUBSTITUTE(TEXT(RMB(A3)/1%,"[DBNUM2]"&RIGHT("0仟0佰0拾0万0仟0佰0拾0元0角0分",LEN(ABS(RMB(A3)/1%))*2)),"零分","整"),"零角","零")

118字符:(正数)  (经过刀砍斧削又减少了10个字符)
=SUBSTITUTE(SUBSTITUTE(TEXT(RMB(A3)/1%,"[DBNUM2]"&RIGHT("0仟0佰0拾0万0仟0佰0拾0元0角0分",LEN(RMB(A3)/1%)*2)),"零分","整"),"零角","零")

如果数字增大,只需将"0仟0佰0拾0万0仟0佰0拾0元0角0分"按格式对应加大即可!

更正:145字符
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TEXT(RMB(A3)/1%,"[DBNUM2]"&RIGHT("0仟0佰0拾0万0仟0佰0拾0元0角0分",LEN(ABS(RMB(A3)/1%))*2)),"零分","整"),"零角整","整"),"零角","零")

看来BUG还是挺多的,在论坛有段时间了,却未有积分,版主见笑了,谅解!

为追求字符少,±0.005以内未处理,如果处理±0.005以内的数据,加个判断语句吧!

另外,根据实际工作,一般情况天文数据还是很少的,所以还是比较适合于实际工作的!

[此贴子已经被作者于2008-8-10 23:59:50编辑过]

TA的精华主题

TA的得分主题

发表于 2008-8-10 22:50 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-10 23:18 | 显示全部楼层
QUOTE:
以下是引用shun2233在2008-8-10 21:56:52的发言:

一亿以内,绝对值0.005以上,不知这个能否算并加分加精呢:

134个字符:
=SUBSTITUTE(SUBSTITUTE(RIGHT(TEXT(RMB(A3)/1%,"[DBNUM2]"&RIGHT("0仟0佰0拾0万0仟0佰0拾0元0角0分",LEN(RMB(ABS(A3))/1%)*2)),30),"零分","整"),"零角整","整")

129字符:(正数)
=SUBSTITUTE(SUBSTITUTE(RIGHT(TEXT(RMB(A3)/1%,"[DBNUM2]"&RIGHT("0仟0佰0拾0万0仟0佰0拾0元0角0分",LEN(INT(A3/1%))*2)),30),"零分","整"),"零角整","整")

如果数字增大,只需将"0仟0佰0拾0万0仟0佰0拾0元0角0分"按格式对应加大即可!


呵呵 原来你是冲分来的。

可惜 你没看清楚1 楼的条件。

以后请自己先测试清楚再发发吧。

就此公式而言,思路令人耳目一新,但结果 : 3.06    叁元零角陆分   这个恐怕不行吧,继续改

0 值也是要处理的.金额的位数也不应小于16位整数。

[此贴子已经被作者于2008-8-11 0:34:24编辑过]

TA的精华主题

TA的得分主题

发表于 2008-8-10 23:19 | 显示全部楼层

1亿以内,经版主数据测试,以下全能通过,143个字符:
=IF(RMB(A3)*1=0,"",SUBSTITUTE(SUBSTITUTE(TEXT(RMB(A3)/1%,"[DBNUM2]"&RIGHT("0仟0佰0拾0万0仟0佰0拾0元0角0分",LEN(ABS(RMB(A3)/1%))*2)),"零分","整"),"零角整","整"))

[此贴子已经被作者于2008-8-11 0:11:50编辑过]

TA的精华主题

TA的得分主题

发表于 2008-8-11 00:14 | 显示全部楼层

150字符,经测试,无问题:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(IF(RMB(A6)*1=0,"",TEXT(INT(A6),"[DBNUM2]")&"元"&TEXT(RIGHT(RMB(A6),2),"[DBNUM2]0角0分")),"零分","整"),"零角整","整"),"零角","零")

送你几个测试数据吧,别把问题想得太简单。

0.55
0.999
0.3
1000
-0.555
3.06
0.005
0
-0.999

[此贴子已经被ldy于2008-8-11 0:26:38编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-11 00:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用shun2233在2008-8-10 23:19:34的发言:

1亿以内,经版主数据测试,以下全能通过,143个字符:
=IF(RMB(A3)*1=0,"",SUBSTITUTE(SUBSTITUTE(TEXT(RMB(A3)/1%,"[DBNUM2]"&RIGHT("0仟0佰0拾0万0仟0佰0拾0元0角0分",LEN(ABS(RMB(A3)/1%))*2)),"零分","整"),"零角整","整"))


“0仟0佰0拾0万0仟0佰0拾0元0角0分” 这个方法就对不行

1000 是这样的 “ 壹仟零佰零拾零元零整”  和 “ 壹仟元整” 差太远了,改都没法改

TA的精华主题

TA的得分主题

发表于 2008-8-14 18:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
等答案![em04]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-14 22:12 | 显示全部楼层
QUOTE:
从最早讨论人民币大写到现在,早已超出了其实用性的范畴,早几年前就有完善的代码和公式了。
研究最短的写法,兴趣、记录和自我挑战是更加重要的因素,同时也能发掘出不少技巧,增加对一些函数、方法的了解。
Format(M, " 0. 0 0;负 0. 0 0;   ")   和 IF(A1^2<1,,"零") 这两种写法就是代表。
QUOTE:
Function dx(M)
    dx = Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;;   ")), ["[DBnum2]"&{0,"","圆0角;;圆零","0分;;整"}]), a), "零圆", a), "零整", "整")  
 '136字符  缺陷:零伍分
End Function
QUOTE:
Function dx(M)
   dx = Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;;   ")), ["[DBnum2]"&{0,"","圆0角;;圆","0分;;整"}]), ""), "零圆", a)  
 '115 字符  错误:伍圆伍分    圆分之间 没有零,虽然最短但根据规则 这是错误的! 这个规则让人郁闷,但规则就是规则。
End Function
QUOTE:
Function dx(M)
    dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;;   ")), ["[DBnum2]"&{0,"","圆0角;;圆零","0分;;整"}]), a), "零圆零", a), "零圆", a), "零整", "整")
 '155字符 A 无缺陷 负数显示 “-”   -伍圆陆角伍分  写法A 圆角间 无零
End Function
QUOTE:
Function dx(M)
    dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;;   ")), ["[DBnum2]"&{0,"","圆0角;;圆","0分;;整"}]), a), "零圆", a), "圆", "圆零"), "零整", "整") 
 '155字符 B 无缺陷 负数显示 “-”   伍圆零陆角伍分  写法B 圆角间 有零
End Function
QUOTE:

仔细阅读了一下规则(8 楼),圆角之间的零可有可无。 但圆分之间必须有零。
但规则没指明 0.03 (只有分)的情况下, 叁分 或 零叁分哪 一种写法正确,通常的习惯 是叁分
规则中也没指出 负数的情况 是是显示 -  还是 负,通常的习惯 是 负, 但个人认为出现负值时 有个明显标识即可,- 与 负 都可以。
Text函数处理负数 也只显示 - 。  =Text(-123,"[DBnum2]")     -->  =   -壹贰叁

如果确定要显示 - 为 负 , 上面的155A 和155B 也用不着增加一个replace(.....,"-","负") 的嵌套。
这也许算是个新发现,因为之前没见过这样的用法: Format函数的参数 居然和 Text 类似 也可以体现 正负零 3 种状态(text是正负零文本4 种状态),但不支持条件参数。
所以155A 或 155B 的formart的参数 改为  Format(M, " 0. 0 0;负 0. 0 0;   "),增加8个字符 即可解决 - 变负的问题

 

QUOTE:
 Function dx(M)
    dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;负 0. 0 0;   ")), ["[DBnum2]"&{0,"","圆0角;;圆零","0分;;整"}]), a), "零圆零", a), "零圆", a), "零整", "整")
   '163字符A 无缺陷 负数显示 “负”   负伍圆陆角伍分 
End Function

 

虽然以上几个函数都相当短,但调用Text数组函数后进行数组到字符串的转换,效率较低。对追求效率的人来说未免有些遗憾。

如果要提高效率,则必须减少对Text函数的调用,VBA中调用Text函数 不能用 "[dbnum2]G/通用格式元;;" 这种在公式中有效方法。
只能想个方法变通。

QUOTE:
Function dx(M)
    dx = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Application.Text(Format(M, ".012034;;0"), "[=]g;[DBnum2]"), "叁肆", "分"), "壹贰", "角"), "零分", "整"), "零角", "零"), "零.零", a), "零.", a), "零整", "整"), ".", "元")
   '214字符 无缺陷 负数显示 “-”   -伍圆陆角伍分  写法A :圆角间 无零,如需显示“负”则要增加一个replace(.....,"-","负") 的嵌套
End Function

 

QUOTE:
Function dx(M)
    dx = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Application.Text(Format(M, ".012034;;0"), "[=]g;[DBnum2]"), ".", "元零"), "叁肆", "分"), "壹贰", "角"), "零分", "整"), "零角", a), "零元零", a), "零元", a), "零整", "整")
   '213字符 无缺陷 负数显示 “-”   -伍圆零陆角伍分  写法B: 圆角间 有零
End Function

 

看看这两个 213 和 214 字符 用了8个Replace函数进行替换,虽然多了50多字符,但速度快了几乎10倍,与用纯VB代码(不使用Application.Text函数)编写函数比也不差。

Format(M, ".012034;;0") 这个用法也属于第一次使用。用 12 代替角,34代替 分,然后替换 Text后的结果,注意,必须是不含0的4个不重复的数字。

------------------------------------------------------------------------------------------------------------------------------

顺便在 附上两个 目前最短的 公式 

167字符A 

QUOTE:
=SUBSTITUTE(SUBSTITUTE(IF(-RMB(A1),IF(A1<0,"负",)&TEXT(INT(ABS(A1)+0.5%),"[dbnum2]G/通用格式元;;")&TEXT(RIGHT(RMB(A1),2),"[dbnum2]0角0分;;整"),),"零角",IF(A1^2<1,,"零")),"零分","整")

  IF(A1<0,"负",) 不能有效处理A1单元格属性是文本(或 =-123&"")的的情况

用 TEXT(A1,";负") 代替  IF(A1<0,"负",) 进行负值判断 可以增加处理文本单元格的功能
 167字符B 

QUOTE:
=SUBSTITUTE(SUBSTITUTE(IF(-RMB(A1),TEXT(A1,";负")&TEXT(INT(ABS(A1)+0.5%),"[dbnum2]G/通用格式元;;")&TEXT(RIGHT(RMB(A1),2),"[dbnum2]0角0分;;整"),),"零角",IF(A1^2<1,,"零")),"零分","整")

 出自 wshcw网友、百度Excel吧


161字符:显示负数为 -  ,这个161字符函数是在与wshcw的交流中学习所得。

QUOTE:
=TEXT(RMB(A1),"[=]g;"&TEXT(INT(ABS(A1)+0.5%),"[dbnum2]G/通用格式元;;")&SUBSTITUTE(SUBSTITUTE(TEXT(RIGHT(RMB(A1),2),"[dbnum2]0角0分;;整"),"零角",IF(A1^2<1,,"零")),"零分","整")) 

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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-18 14:32 , Processed in 0.041484 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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