| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2876 人关注过本帖, 2 人收藏
标题:小数转换成大写中文(最终版出炉)
只看楼主 加入收藏
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
收藏(2)
 问题点数:0 回复次数:18 
小数转换成大写中文(最终版出炉)
4.23日:最终版在17楼,欢迎大家测试使用哈!


今天在做账单,要这个功能的函数。
自己写了一个,给大家分享一下。代码比较丑,有高手顺便改改么?
我这个现在支持int的2位的小数都可以。可是公司的人告诉我要改下,如果有3位小数就有问题了。我的确汗中。
一下是代码,大家有兴趣玩玩看看用用哈!
程序代码:
protected string FormatAmount(string amount)
    {
        string str = "";
        char[] TOBIG = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
        char[] TOUNIT = { '元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟' };

        if (amount[amount.Length - 3] == '.')
        {
            for (int i = 0; i < amount.Length - 3; i++)
            {
                int j = amount.Length - 4 - i;
                if (amount[i] == '0')
                {
                    for (int k = i; k < amount.Length - 1; k++)
                    {
                        if (amount[i + 1] == '0' || amount[i + 1] == '.')
                            i++;
                    }
                    if (i == amount.Length - 1)
                        str += "整";
                    else
                        str += TOBIG[0];
                }
                else
                {
                    str += TOBIG[int.Parse(amount[i].ToString())].ToString();
                    str += TOUNIT[j].ToString();
                }
            }
            if (amount[amount.Length - 2] != '0')
                str += TOBIG[int.Parse(amount[amount.Length - 2].ToString())].ToString() + "角";
            if (amount[amount.Length - 1] != '0')
                str += TOBIG[int.Parse(amount[amount.Length - 1].ToString())].ToString() + "分";
        }
        else
        {
            for (int i = 0; i < amount.Length; i++)
            {
                int j = amount.Length - 1 - i;
                if (amount[i] == '0')
                {
                    if (amount[i + 1] == '0')
                        i++;
                    if (i == amount.Length - 1)
                        str += "整";
                    else
                        str += TOBIG[0];
                }
                else
                {
                    str += TOBIG[int.Parse(amount[i].ToString())].ToString();
                    str += TOUNIT[j].ToString();
                }
            }
        }
        return str;
    }


谢谢各位看了!

[[it] 本帖最后由 走刀口→超 于 2008-4-23 11:14 编辑 [/it]]
收到的鲜花
  • hebingbing2008-04-22 18:46 送鲜花  5朵  
搜索更多相关主题的帖子: 小数 中文 出炉 
2008-04-22 16:42
hebingbing
Rank: 6Rank: 6
来 自:黄土高坡
等 级:贵宾
威 望:27
帖 子:3417
专家分:371
注 册:2007-10-22
收藏
得分:0 
忒牛了……
这绝对是首创……
从来没有见过这么有意义的代码……
收到的鲜花
  • 走刀口→超2008-04-22 20:15 送鲜花  8朵   附言:砸死你!
2008-04-22 17:03
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
收藏
得分:0 
-。-LS不要取笑我了。
本来我写的是switch...case被经理说了顿。


人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2008-04-22 17:07
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
收藏
得分:0 
新版本,才弄的,放在论坛上回家还能看看。
支持了多位小数。。。不过肯定还少了个整。T.T

程序代码:
protected string FormatAmount(string amount)
    {
        string str = "";
        char[] TOBIG = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
        char[] TOUNIT = { '元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟' };
        char[] TOUNITDE = { '角', '分', '里'};
        string amount1 = "";
        string amount2 = "";
        int dot = amount.IndexOf('.');
        if (dot == -1)
        {
            dot = amount.Length;
            amount1 = amount.Substring(0, dot);
        }
        else
        {
            amount1 = amount.Substring(0, dot);
            amount2 = amount.Substring(++dot , amount.Length - dot);
        }

        for (int i = 0; i < amount1.Length; i++)
        {
            int j = amount1.Length - 1 - i;
            if (amount1[i] == '0')
            {
                if (amount1[i + 1] == '0')
                    i++;
                if (i == amount1.Length - 1)
                    str += "整";
                else
                    str += TOBIG[0];
            }
            else
            {
                str += TOBIG[int.Parse(amount1[i].ToString())].ToString();
                str += TOUNIT[j].ToString();
            }
        }
        if (dot != amount.Length)
        {
            for (int i = 0; i < amount2.Length; i++)
            {
                str += TOBIG[int.Parse(amount2[i].ToString())].ToString();
                str += i > 2 ? "" : TOUNITDE[i].ToString();
            }
        }
收到的鲜花
  • hebingbing2008-04-22 18:46 送鲜花  5朵   附言:精品文章 这东西太实用....

人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2008-04-22 17:44
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
收藏
得分:0 
我也想不出什么多位后面的单位了。。。谁想想。哈哈。

人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2008-04-22 17:45
淡漠的茶
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-3-8
收藏
得分:0 
private string GetUP(double Price)
    {
        char[] TOBIG = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
        int bw = (int)(Price / 1000000);
        double tsw = (Price - bw * 1000000);
        int sw = (int)(tsw / 100000);
        double tw = (tsw - sw * 100000);
        int w = (int)(tw / 10000);
        double tq = (tw - w * 10000);
        int q = (int)(tq / 1000);
        double tb = (tq - q * 1000);
        int b = (int)(tb / 100);
        double ts = (tb - b * 100);
        int s = (int)(ts / 10);
        int y = (int)(ts % 10);
        double tp = (int)((ts - s * 10 - y) * 100);
        int j = (int)(tp / 10);
        int f = (int)(tp % 10);
        string ot = char[bw]+"佰"+char[sw]+"拾"+char[w]+"萬"+char[q]+"仟"+char[b]+"佰"+char[s]+"拾"+char[y]+"圆"+char[j]+"角"+char[f]+"分";
        return ot;
    }

我这个就比较郁闷了,哈哈,前段时间写的一个精确WEB控制打印出(入)库单里写的,只到百万,和分,因为超不过百万,也不会有厘出现
2008-04-22 19:30
淡漠的茶
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-3-8
收藏
得分:0 
不采用循环的原因是想显示成0000001.22 这样的效果,哈哈
2008-04-22 19:48
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
收藏
得分:0 
哪有0000001.22这样的价格哦。。。这样不好。这个价格不切实际!出现小数后3位的我已经不能接受了!

人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2008-04-22 19:51
淡漠的茶
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-3-8
收藏
得分:0 
Convet.Int32会四随五入
(int)强转换不会
2008-04-22 19:51
淡漠的茶
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-3-8
收藏
得分:0 
有的,出库单 入库单 发票需要写成这样
因为采用打印,无法辨别字体的,别人完全可以前在前面加打印
要么用人民币符号,要么用零封死
不管是数字还是大写前面都要封死
还因为这些单子的格式本来就是固定的,得充满封死
采用大写本来的作用就是防止改动,不然就会出现康熙遗昭传位十四子变传位于四子,光大写了还不行,还得前后封死。封死就安全了,因为打印报表中不可能出现 二十百万的这样的情况的,又不是老外的那种表示方法

如果不是打印,不是形成纸张形式,你转换大写就完全是多此一举,根本没必要。打印你就必须封,你可以问问你们财务是不是这个规则

再牛的代码如果你不契合实际需要也是白搭的,金钱慎重

[[it] 本帖最后由 淡漠的茶 于 2008-4-22 20:12 编辑 [/it]]
2008-04-22 19:54
快速回复:小数转换成大写中文(最终版出炉)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018597 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved