文章目录
  1. 1. 背景
  2. 2. 知识背景
  3. 3. 应用
  4. 4. 一点补充
  5. 5. 例子

背景

公司去年换了名字,之后所有的格式表单都得重新做,然后财务趁着这个机会顺便也把报销申请表重做了一下。然后用新的表单去报销被退回来了,因为人民币大写的格式不对,当时我就有点纳闷了,大写转换是表单里面公式设好的,我们只是在上面填了一个数字而已啊。
但是的确,填进数字后显示果然怪怪的:
01
然后检查了一下,发现原来的公式有点问题,但是有趣的是如果直接在公式格子里面填数字的话,显示的倒是正确的大写格式。报销是头等大事,没办法,只能查查看了。
02

知识背景

Text(value,format_text)函数可以将数值转化为文本,并且可以指定文本格式。所以在混排数字和文本(例如:xxx元或者xx人)的时候很有用
Text函数
DBNUM是数字转中文大写的自定义格式,DBNUM有三个类型([DBNUM1][DBNUM2][DBNUM3])和两种参数([$-404]对应中文繁体[$-804]对于中文简体)
举例说明就是:

99999 [DBNum1][$-404]G/通用格式 九萬九千九百九十九 (繁体中文大写单位为普通模式)
99999 [DBNum2][$-804]G/通用格式 玖万玖仟玖佰玖拾玖 (简体中文大写单位为大写模式)
99999 [DBNum3][$-804]G/通用格式 9万9千9百9十9 (简体数字保留,单位用中文普通模式)

应用

所以我们用一个函数Text(A1,”[DBNum1][$-804]G/通用格式”)就可以把数字转换成我们要的中文大写。
但是还有个问题,这个是报销用的,后面要跟元角分的,也就是说如果是112.12的话必须转化成壹佰壹拾贰元壹角贰分才行,这里就牵涉到以下几种情况:

  • 112 壹佰壹拾贰元整 (整数)
  • 112.1 壹佰壹拾贰元壹角 (只到角)
  • 112.12 壹佰壹拾贰元壹角贰分 (有角有分)
  • 112.02 壹佰壹拾贰元零贰分 (有分但是没有角)

最后一种情况的话其实壹佰壹拾贰元零角贰分似乎也是可以的啦,不过零贰分看起来要好看一些。
所以针对这几种情况就得分别if一下,这里判断条件是条条大路通罗马,我这里只用一种比较简单的。
我们这里要判断的是第一,是不是小数点后1位和2位都没有,我们用INT可以取整,所以把数字乘以100然后比较一下就可以啦,第一层if是这样的:
if(INT(A1*100)=(INT(A1)*100)),"整钱","不是整钱")

对于整钱的情况直接把A1转换成大写中文数字,后面再加上“元整”就可以了

if(INT(A1*100)=(INT(A1)*100),Text(A1,"[DBNum1][$-804]G/通用格式元整"),"不是整钱")

然后对于不是整数的部分我们再来分,对于带小数的数字,元的部分我们还是用一个Text(INT(A1),”[DBNum1][$-804]G/通用格式元整”)就可以了,主要是对于小数部分,要分别判断第1位和第2位是不是0
既然我们用INT(A1100)和100INT(A1)可以来判断小数点后第一第二位是不是都是0了,用10的话就能判断第一位了嘛
于是10
INT(A1)=INT(A1*10)的话,说明小数点后第一位是0,不然的话小数点后第一位就不是0
既然我们第一个if已经做过两位判断了,所以小数点后第一位是0的话第二位肯定不是0,所以就对应着壹佰壹拾贰元零贰分 (有分但是没有角)这种情况。
如果小数点后第一位不是0的话,我们还要判断一下第二位是不是0。
虽然有点绕,但是基本思路已经整理清楚了。
第二层的if是

if(10*INT(A1)=INT(A1*10),"小数点后第一位是0","小数点后第一位就不是0")

第三层就是再对小数点后第二位检查一下用

if(INT(100*A1)=10*INT(10*A1),"小数点后第2位是0","小数点后第二位不是0")

就可以了。(这里就不多解释了,想想为什么这样写)
三层判断都有了,我们来把内容填进公式吧,注意的是因为Excel函数里面没法写变量,所以要尽量把可以重复使用的东西放在一起,公式就出来了:

=TEXT(INT(A5),"[DBNum2][$-804]G/通用格式元")&IF(INT(A5*100)=(INT(A5)*100),"整",
IF(10*INT(A5)=INT(A5*10),"零"&TEXT(INT(100*A5)-10*INT(10*A5),"[DBNum2][$-804]G/通用格式分"),
TEXT(INT(A5*10)-10*INT(A5),"[DBNum2][$-804]G/通用格式角")&IF(INT(100*A5)=10*INT(10*A5),"",
TEXT(INT(100*A5)-10*INT(10*A5),"[DBNum2][$-804]G/通用格式分"))))

这样就完成了啦,请注意一下上述公式里面哪些是复用的数字,看看能不能再更精简一点。

一点补充

对于一开始的,为什么把公式去掉直接写数字就可以了的问题,其实是单元格的格式里面设置成了[DBNum2][$-804]G/通用格式,所以如果去掉了公式直接填写数字的话,就服从单元格的格式显示成了中文数字,但是如果单元格里面的公式会指定格式的话,公式里面的公式优先级比较高,所以单元格的格式就没用了。
03

还有一点补充的,如果发现这样设置了出来的是直接显示 /通用格式 的话,请检查一下系统里面区域语言选项内,是不是格式不是中文。

例子

Excel中文金额.xlsx