EnglishConverter

数値から英語読みに変換するあまり需要のないコンバータ。
Project Euler Problem 17のために作ったw

数値から英語読みに変換するあまり需要のないコンバータ。
Project Euler Problem 17のために作ったw

  • タグ:
  • タグはありません
    class EnglishConverter
    {
        static readonly string[] underTwenty =
        {
            "zero"
            , "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"
            ,"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
        };

        static readonly string[] ten =
        {
            "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
        };

        static readonly string[] largeNumbers =
        {
            "thousand", "million", "billion", "trillion", "quadrillion", "quintillion"
        };

        public enum Format
        {
            England
            , American
        }

        public static string ToString(long number, Format format = Format.American)
        {
            if (number < 0)
            {
                return string.Format("{0} {1}", format==Format.England ? "minus" : "negative", ToString(number * -1, format));
            }
            else if (number < 20)
            {
                return underTwenty[(int)number];
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                if (number < 100)
                {
                    long onevalue;
                    long tenvalue = Math.DivRem(number, 10, out onevalue) - 1;
                    sb.Append(ten[(int)tenvalue]);
                    if (onevalue != 0)
                    {
                        sb.AppendFormat("-{0}", ToString(onevalue, format));
                    }
                }
                else if (number < 1000)
                {
                    long rem;
                    long div = Math.DivRem(number, 100, out rem);
                    sb.AppendFormat("{0} hundred", ToString(div, format));
                    if (rem != 0)
                    {
                        sb.AppendFormat(" {0}{1}", (format==Format.England)? "and " : "", ToString(rem));
                    }
                }
                else
                {
                    for (int i = 0; i < largeNumbers.Length; ++i)
                    {
                        if (number < Math.Pow(1000, i + 2))
                        {
                            long rem;
                            long div = Math.DivRem(number, (long)Math.Pow(1000, i + 1), out rem);
                            sb.AppendFormat("{0} {1}", ToString(div, format), largeNumbers[i]);
                            if (rem != 0)
                            {
                                sb.AppendFormat(" {0}{1}", (format == Format.England) ? "and " : "", ToString(rem));
                            }
                            break;
                        }
                    }
                }
                return sb.ToString();
            }
        }
    }