如何数字转换为中文大写[winform学习实例]

转:http://topic.csdn.net/u/20111108/09/b720c3be-5374-4ee0-b81f-468a5886bf5b.html#replyachor 16楼的内容如下:

//我封装的类如下:using System.Text.RegularExpressions;namespace DBUtility{ public class MoneyNumToCNS { public static string Get(string Num) { string x = double.Parse(Num).ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A"); string y = Regex.Replace(x, @"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}"); string CHS = Regex.Replace(y, ".", delegate(Match m) { return "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟萬億兆京垓秭穰"[m.Value[0] - '-'].ToString(); }); return CHS; } }}


经过测试发现不准确,精度到兆就出错了,好像是四舍五入法则出错的缘故,如果这样那么兆再往上的大数就不该做出来,到京时如果存入的尾钱在5万则会得出10万则多给5万,如果存入的尾钱为49999则损失5万,如是则出现计算错误.从精确的算术角度来说这是不容许的程序错误。


刚在另外一台电脑上测试一下,还是错误的,
1.从10兆开始10000000000123.123,那么精度只在兆内.

2.从京开始10000000000041123.123//1000000000000051123.123//10000000000000051123.123
从科学严谨来看这是错不?以上给你4个测试的数字

有趣的自证图片示例

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

共享链接:http://163.fm/QadaZzA提取码:BmOOKhTN

------------------------------------------------------------------------最后一次公布2011/12/5----重写中文大写转数字,这下可以说已无瑕疵.

我自己设计的一个则没这种错误出现.

我的代码片断如下:

        private void button6_Click(object sender, EventArgs e)//转换中文数值
        {
            textBox2.Text = "";
            string DD_BM = textBox1.Text.Trim();

            //textBox2.Text = ZongWenSuZhi.Get(DD_BM);//调用类也会出现错误如1000000000000023.123,
                                                      //10000000000000041123.123,10000000000000051123.123

            string[] Fg = new string[2];
            if (DD_BM.IndexOf(".") >= 0)
            {
                Fg = DD_BM.Split('.');
                textBox2.Text += TiHuan(Zh_Zwz(Fg[0], "整数"));
                textBox2.Text += TiHuan(Zh_Zwz(Fg[1], "小数"));
            }
            else
            { textBox2.Text = TiHuan(Zh_Zwz(DD_BM, "整数")) + "整"; }
        }
        
        private string Zh_Zwz(string DD_BM,string BiaoJi, bool Zs)//[等效]转换中文<>数字互换
        {
            string Sz = "", Bj = "0123456789", Zz = "零壹贰叁肆伍陆柒捌玖";
            for (int Qs = 0; Qs < DD_BM.Length; Qs++)
            {
                string Zf = DD_BM.Substring(Qs, 1);//依循环取其中一个字符
                if (Bj.IndexOf(Zf) >= 0 && !Zs)//比较
                { Sz += Zz.Substring(Bj.IndexOf(Zf), 1); }//等效

                if (Zz.IndexOf(Zf) >= 0 && Zs)
                { Sz += Bj.Substring(Zz.IndexOf(Zf), 1); }
             }
            if (Zs) Sz = "." + Sz;//补
            if (BiaoJi == "小数") { Sz = XiaoShu(Sz); }
            if (BiaoJi == "整数") { Sz = ZhengShu(Sz); }
            return Sz;
        }

        private string ZhengShu(string ZsBf)//整数部分
        {
            
            string[] Jz = { "元", "拾", "佰", "仟" };
            string[] Jzs = { "拾", "佰", "仟" };
            string[] Zs = { "万", "亿", "兆","京","垓","秭","穰","沟","涧","正","载","极",
                            "恒河沙", "阿僧祇", "那由他","不可思议","无量" };
            string ZsB = ""; int Ws = ZsBf.Length, Jw = 0, Cs = 0;
            for (int Qs = 0; Qs < Ws; Qs++)
            {
                Cs++;

                string Cr = "", Dx = ZsBf.Substring(Ws - (Qs + 1), 1);//倒序读取1个字符

                if (Cs < 5 && Jw == 0)
                {
                    Cr = Dx.Insert(1, Jz[Cs - 1]);
                }//插入万以内
                else if (Cs < 4 && Jw > 0)
                {
                    Cr = Dx.Insert(1, Jzs[Cs - 1]);
                }//插入万以后
                else
                { Cr = Dx.Insert(1, Zs[Jw]); Jw++; Cs = 0; }//进位

                if (ZsB == "") { ZsB = Cr; }//顺序合成
                else { ZsB = ZsB.Insert(0, Cr); }
            }
            return ZsB;
        }

        private string XiaoShu(string XsBf, bool Zs)//中文<>数字互换小数部分
        {
            string[] Xs = { "角", "分", "厘","毫","丝","忽","微","纤","沙","尘","埃","渺","莫",
                            "模糊", "逡巡","须臾","瞬息","弹指","刹那","六德","空虚","清静" };
            string XsB = "";bool Kz = true;
            for (int Qs = 0; Qs < XsBf.Length; Qs++)
            {
                if (Zs == true)//还原
                {
                    XsB = XsBf;
                    for (int Sz = 0; Sz < Xs.Length; Sz++)
                    {
                        if (XsB.IndexOf(Xs[Sz]) >= 0 && Kz) { Kz = !Kz; }
                        if (XsB.IndexOf(Xs[Sz]) < 0 && Kz) { XsB = "零" + XsB; }//前补
                        XsB = XsB.Replace(Xs[Sz], "");
                    }
                }
                else//合成
                {
                    for (int Qs = 0; Qs < XsBf.Length; Qs++)
                    {
                        XsB += XsBf.Substring(Qs, 1).Insert(1, Xs[Qs]);
                    }
                }
            }
            return XsB;
        }
以上完成部分功能,完整功能尚在调试中,待后更新。。。。。。
好了今天下午已经完成剩余部分功能设计.尚有些扫尾需要写了,整数可以计算到69位,小数尚未测试过,待测试后发布可执行文件到我的资源中,还需要大家一起测试看有无错误出现,谢谢.2011-11-11(如:100000000000000000000000000000000000000000000000000000000000000055551得到:壹无量零伍万伍仟伍佰伍拾壹元整;若再加000得到:壹仟无量零伍万伍仟伍佰伍拾壹元整,需要限制到无量就可以了,就这个扫尾编写了;这个限制有待斟酌和讨论,是保留壹无量,还是转换为无量?如果有壹无量那么就有玖仟无量存在,未免超过了无量的意义,还有清净也应该限制.)
阿拉伯数字转换中文大写(全:大到无量,小到清净)

周末趁热打铁赶了一整天终于写完成并粗鲁测试了一下,发布出来欢迎大家测试交流,如果有发现问题请给我留言,谢谢!如果您用了欢喜,那么,请欢喜合掌,就是我得到回报了,哈哈......

发布这个包里面包含一个未打包的可执行文件和一个打包的安装文件.

http://download.csdn.net/detail/xianfajushi/3787774
以上代码只是随笔写着玩的,就直接拿现成的代码改了一下,实现的方法不只一种,相信高手们写的代码比我更漂亮和更有效率.
今天终于写完成了,怕我写的有错误又没进过深入校对,所以,调用了一个类做为对照,借此来发现有无错误存在,以便改正;这样小的软件代码不算很多,循环次数也不算多,也没时间去优化代码了,倒是有做个DLL的打算,目前就这样了,以后再说吧,因为相信有人写得更好,函数也会改进的,先做别的事了。
首先声明无意冒犯顺手拿来就用,没时间找别的了,测试对比数字100200300400506040409090909088888.444458:
壹沟零贰拾穰零叁佰秭肆仟零伍垓零陆佰零肆京零肆佰零玖兆零玖佰零玖亿零玖佰零捌万捌仟捌佰捌拾捌元肆角肆分肆厘肆毫陆丝
壹零贰穰零叁佰秭肆仟零伍垓零陆佰京元(对照:网络上某金额大写转换封装类)
如果有异议将删除以上信息
今天测试发现以上转化代码可以跳过数字中包含有逗号,也就是说数字有逗号的也可以,不用另写对逗号的处理,意想不到,歪打正着.
http://wenku.baidu.com/view/fa1e57fe04a1b0717fd5ddf7.html   c#如何为WINFORM程序打包发布应用图解
累了休闲一下写几个字:有了以上代码进行基础转换后,在此基础上相信不难进一步完善了,相信高手们定能写出下一步处理的语句了.上门的代码就少了TiHuan()这一段处理代码了,有多种语句都可以实现的,其实发布的软件这两天我发觉还有一处尚未完善,那就是小数四舍五入我只写了8位,更全面的应该写到21位,那么,用四舍五入函数一定是做不到的了(测试了一下好像在15位数内),因为数字位数的限制影响,不过,我觉得经过适当的处理,四舍五入函数还是一样能用来处理到21位的数字.
总觉得哪里还没写好,今天果然发现一个错误,正在调试中......
调试完成,但不知道还有没错误存在.更新后的文件链接在上面查看2011-11-17
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值