欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-22 08:59:04
实现代码: 复制代码 代码如下:// 例如:(new money(200)).tostring() == "贰佰元"namespace skyiv.util { ...

实现代码:

复制代码 代码如下:

// 例如:(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();
        }
    }
}