C#把数字转换成大写金额的代码实例

 更新时间:2014年05月27日 10:47:46   作者:  
这篇文章主要介绍了C#把数字转换成大写金额的代码实例,例如把200转换成“贰佰元”,需要的朋友可以参考下

实现代码:

复制代码 代码如下:

// 例如:(new Money(200)).ToString() == "贰佰元"
namespace Skyiv.Util {
    using System.Text;
    class Test {
        static void Main() {
            for (;;) {
                System.Console.Write("金额: ");
                string s = System.Console.ReadLine();
                decimal m;
                try {
                    m = decimal.Parse(s);
                } catch {
                    break;
                }
                System.Console.WriteLine("大写: " + new Money(m));
            }
        }
    }
    // 该类重载的 ToString() 方法返回的是大写金额字符串
    class Money {
        public string Yuan = "元"; // “元”,可以改为“圆”、“卢布”之类
        public string Jiao = "角"; // “角”,可以改为“拾”
        public string Fen = "分"; // “分”,可以改为“美分”之类
        static string Digit = "零壹贰叁肆伍陆柒捌玖"; // 大写数字
        bool isAllZero = true; // 片段内是否全零
        bool isPreZero = true; // 低一位数字是否是零
        bool Overflow = false; // 溢出标志
        long money100; // 金额*100,即以“分”为单位的金额
        long value; // money100的绝对值
        StringBuilder sb = new StringBuilder(); // 大写金额字符串,逆序
        // 只读属性: "零元"
        public string ZeroString {
            get {
                return Digit[0] + Yuan;
            }
        }
        // 构造函数
        public Money(decimal money) {
            try {
                money100 = (long)(money * 100m);
            } catch {
                Overflow = true;
            }
            if (money100 == long.MinValue) Overflow = true;
        }
        // 重载 ToString() 方法,返回大写金额字符串
        public override string ToString() {
            if (Overflow) return "金额超出范围";
            if (money100 == 0) return ZeroString;
            string[] Unit = {
                Yuan,
                "万",
                "亿",
                "万",
                "亿亿"
            };
            value = System.Math.Abs(money100);
            ParseSection(true);
            for (int i = 0; i < Unit.Length && value > 0; i++) {
                if (isPreZero && !isAllZero) sb.Append(Digit[0]);
                if (i == 4 && sb.ToString().EndsWith(Unit[2])) sb.Remove(sb.Length - Unit[2].Length, Unit[2].Length);
                sb.Append(Unit[i]);
                ParseSection(false);
                if ((i % 2) == 1 && isAllZero) sb.Remove(sb.Length - Unit[i].Length, Unit[i].Length);
            }
            if (money100 < 0) sb.Append("负");
            return Reverse();
        }
        // 解析“片段”: “角分(2位)”或“万以内的一段(4位)”
        void ParseSection(bool isJiaoFen) {
            string[] Unit = isJiaoFen ? new string[] {
                Fen,
                Jiao
            }: new string[] {
                "",
                "拾",
                "佰",
                "仟"
            };
            isAllZero = true;
            for (int i = 0; i < Unit.Length && value > 0; i++) {
                int d = (int)(value % 10);
                if (d != 0) {
                    if (isPreZero && !isAllZero) sb.Append(Digit[0]);
                    sb.AppendFormat("{0}{1}", Unit[i], Digit[d]);
                    isAllZero = false;
                }
                isPreZero = (d == 0);
                value /= 10;
            }
        }
        // 反转字符串
        string Reverse() {
            StringBuilder sbReversed = new StringBuilder();
            for (int i = sb.Length - 1; i >= 0; i--) sbReversed.Append(sb[i]);
            return sbReversed.ToString();
        }
    }
}

相关文章

  • C#访问及调用类中私有成员与方法示例代码

    C#访问及调用类中私有成员与方法示例代码

    访问一个类的私有成员不是什么好做法,大家也都知道私有成员在外部是不能被访问的,这篇文章主要给大家介绍了关于C#访问及调用类中私有成员与方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-06-06
  • c# 开发语音识别程序

    c# 开发语音识别程序

    这篇文章主要介绍了用c# 开发语音识别程序,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-09-09
  • 详解C# Socket编程笔记

    详解C# Socket编程笔记

    这篇文章主要介绍了详解C# Socket编程笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-12-12
  • unity 如何修改材质属性和更换shader

    unity 如何修改材质属性和更换shader

    这篇文章主要介绍了unity 修改材质属性和更换shader的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#桥接模式完整实例

    C#桥接模式完整实例

    这篇文章主要介绍了C#桥接模式,以实例形式较为详细的分析了C#桥接模式的实现原理与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#实现将Doc文档转换成rtf格式的方法示例

    C#实现将Doc文档转换成rtf格式的方法示例

    这篇文章主要介绍了C#实现将Doc文档转换成rtf格式的方法,结合实例形式分析了C#针对word文件的读取及文档格式转换相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • Unity3D使用陀螺仪控制节点旋转

    Unity3D使用陀螺仪控制节点旋转

    这篇文章主要为大家详细介绍了Unity3D使用陀螺仪控制节点旋转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C# 拓展方法的简单实例

    C# 拓展方法的简单实例

    这篇文章介绍了C# 拓展方法的简单实例,有需要的朋友可以参考一下
    2013-08-08
  • c# 如何实现获取二维数组的列数

    c# 如何实现获取二维数组的列数

    这篇文章主要介绍了c# 实现获取二维数组的列数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#遍历文件夹及子目录下所有图片

    C#遍历文件夹及子目录下所有图片

    这篇文章主要为大家详细介绍了C# 遍历文件夹及子目录下所有图片的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论