2015年01月28日

C#で整数の漢数字表記

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その66

キーボードから正の整数を入力すると、それを漢数字で表示するプログラムを作ってください

☆ 例えば「1732050807568877」なら「千七百三十二兆 五百八億 七百五十六万 八千八百七十七」といった感じです
☆ 「一七三二兆 〇五〇八億 〇七五六万 八八七七」ではダメですよ^^;

このお題は匿名での投稿です。 与えられる整数の範囲は一京未満(10000000000000000未満)としたいと思います。 ご投稿ありがとうございます。

int, kong の拡張メソッドとして定義してみました。
一万未何の数を漢数字に変換する ToKansuujiUnder10000 というprivateメソッドを定義し、 それを利用することで、それよりも大きな数でも対応できるようにしています。
一京以上かどうかのチェックはやってません。 ちなみに、 0は'零'と表示するようにしました。

using System;
using System.Text;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            while (true) {
                string s = Console.ReadLine();
                Console.WriteLine(long.Parse(s).ToKansuuji());
            }
        }
    }

    public static class KanjiExtentions {
        static string[] digit = { "", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
        static string[] subUnit = { "", "十", "百", "千" };
        static string[] unit = { "", "万", "億", "兆" };

        public static string ToKansuuji(this int n) {
            return ToKansuuji((long)n);
        }
        public static string ToKansuuji(this long n) {
            int unitCol = 0;
            string s = "";
            // 一の位から順に大きな位へ
            for (; n > 0; n /= 10000, unitCol++ ) {
                int x = (int)(n % 10000);            // 10000(一万)の単位で処理をしていく。
                string t = ToKansuujiUnder10000(x);
                s = x == 0 ? t + s
                           : t + unit[unitCol] + " " + s;
            }
            return s.Length == 0 ? "零" : s;
        }

        private static string ToKansuujiUnder10000(long n) {
            string s = "";
            for (int subCol = 0; subCol < 4; subCol++) {
                long amari = n % 10;
                if (amari > 0)                 // ゼロの時はその単位を表示しない
                    s = subUnit[subCol] + s;
                if (amari != 1 || subCol == 0) // 一百のようにならないように制御
                    s = digit[amari] + s;               
                n /= 10;
            }
            return s;
        }
    }
}


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52403872