国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#把數字轉換成大寫金額的代碼實例

2020-01-24 02:40:35
字體:
來源:轉載
供稿:網友

實現代碼:

復制代碼 代碼如下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 河北省| 罗平县| 海宁市| 厦门市| 绥化市| 南溪县| 三河市| 遵化市| 金华市| 丹江口市| 阜康市| 大化| 那坡县| 修文县| 本溪市| 隆昌县| 阿尔山市| 天气| 耒阳市| 平湖市| 怀化市| 徐汇区| 东宁县| 社旗县| 普兰县| 宁武县| 博罗县| 甘洛县| 永济市| 东海县| 宿迁市| 宜宾市| 阜宁县| 西和县| 会泽县| 金秀| 瑞昌市| 望谟县| 元阳县| 来宾市| 福州市|