有人问到这个问题,如何把金额数字按位分配到相应的单元格?比如输入¥123.45,就将5分配到分,4分配到角,3分配到元,2分配到十元,1分配到百元,依次类推。
即:
亿 |
千万 |
百万 |
十万 |
万 |
千 |
百 |
十 |
元 |
角 |
分 |
|
1 |
1 |
7 |
7 |
2 |
3 |
5 |
4 |
3 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11772354.32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在A8中输入任一个数(如上面的11772354.32),让它们自动分配到第二行相应的位置 |
|
我立即将这个问题解决了,思路是将输入的数字做为字符串,去找小数点的位置(如无小数点,则认为是在最后一个字符的后面),然后,截取小数点后两位的字符,将它分配到分,再截取小数点后一位的字符,将它分配到角,然后再截取小数点前一位的字符,将它分配到元,然后截取小数点前两位的字符,分配到十元处,依次类推。
以上是基本思路,写公式时,加上了错误处理,最终公式为(仅列出分配“分”的公式):
=IF(ISERROR(MID($A$8,IF(ISERROR(FIND(".",$A$8)),LEN($A$8)+1,FIND(".",$A$8))+2,1)),"",MID($A$8,IF(ISERROR(FIND(".",$A$8)),LEN($A$8)+1,FIND(".",$A$8))+2,1))
它工作得很好。
我又将以上解决方案稍作修改,使更加方便用户:
输入 |
亿 |
千万 |
百万 |
十万 |
万 |
千 |
百 |
十 |
元 |
角 |
分 |
134.34 |
|
|
|
|
|
|
1 |
3 |
4 |
3 |
4 |
31,485,345.34 |
|
3 |
1 |
4 |
8 |
5 |
3 |
4 |
5 |
3 |
4 |
32.00 |
|
|
|
|
|
|
|
3 |
2 |
|
|
275,423,442.33 |
2 |
7 |
5 |
4 |
2 |
3 |
4 |
4 |
2 |
3 |
3 |
3,454,366.54 |
|
|
3 |
4 |
5 |
4 |
3 |
6 |
6 |
5 |
4 |
11.00 |
|
|
|
|
|
|
|
1 |
1 |
|
|
以上所说的表格,可以通过此链接下载:
201003311848525826.xls
我的同学也给了一个解决方案,她的思路和我的完全不同,她是将数字仍然看成数字(我是看成字符串处理的!),通过取整来达到目的。
即对一个金额¥123.45,要求出十元位置的2,那么,先将123.45除以10并取整得12,再将123.45除以100取整得1,再将结果乘以10得10,最后用12减去10得到正确的结果2。要求出百元位置的1,那么按同样的算法,将123.45除以100并取整得1,再将123.45除以1000取整得0,再将结果乘以10仍得0,最后1减去0得到结果1。其它位置依次类推。
她的解决方案我很喜欢,公式非常简洁,如:
千万 |
百万 |
十万 |
万 |
千 |
百 |
十 |
元 |
角 |
分 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
3 |
1 |
2 |
|
|
|
|
|
|
|
|
|
|
|
输入--> |
1113.12 |
|
|
|
|
|
|
|
其中求分的公式为:=INT(C4*100)-INT(C4*10)*10,C4即为1113.12所处于的单元格。
这个Excel表格可以通过以下链接下载:
201003311857160477.xls
总结:
可能是由于一直学习编程,经常对字符串进行处理,我的思维方式已经是计算机的思维方式了。我的同学是数学系的(当然我也是),仍然保留着数学人的思维方式,很好,至简。