Esempio n. 1
0
        /// <summary>
        /// Gets the string of a specific number.
        /// </summary>
        /// <param name="number">The number.</param>
        /// <returns>A string for the number.</returns>
        public string ToString(double number)
        {
            if (double.IsNaN(number))
            {
                return("NaN");
            }
            if (number > 0)
            {
                if (number <= ulong.MaxValue)
                {
                    var numInt = (ulong)number;
                    if (numInt == number)
                    {
                        return(ToString(numInt));
                    }
                }
                else if (double.IsPositiveInfinity(number))
                {
                    return(IsKana ? "せいのむげんだい" : "正の無限大");
                }
            }
            else if (number > long.MinValue)
            {
                var numAbs = Math.Abs(number);
                var numInt = (ulong)numAbs;
                if (numInt == numAbs)
                {
                    return(NegativeSign + ToString(numInt));
                }
            }
            else if (double.IsNegativeInfinity(number))
            {
                return(IsKana ? "ふのむげんだい" : "負の無限大");
            }

            var str = new StringBuilder();

            var(integerPart, fractionalPart, exponentialPart) = NumberSymbols.SplitNumber(number);
            str.Append(ToString(integerPart, false));
            if (fractionalPart.Length > 0)
            {
                str.Append(IsKana ? "てん" : "点");
                foreach (var item in fractionalPart)
                {
                    if (IsKana)
                    {
                        str.Append(ConvertString(digits[int.Parse(item.ToString())].ToString()));
                    }
                    else
                    {
                        str.Append(digits[int.Parse(item.ToString())]);
                    }
                }
            }

            if (exponentialPart > 0)
            {
                if (exponentialPart % 4 == 0 && exponentialPart < 45)
                {
                    if (IsKana)
                    {
                        str.Append(ConvertString(digits[12 + exponentialPart / 4].ToString()));
                    }
                    else
                    {
                        str.Append(digits[12 + exponentialPart / 4]);
                    }
                }
                else
                {
                    str.Append(IsKana ? "かける" : "掛ける");
                    str.Append(TenClass);
                    if (exponentialPart > 1)
                    {
                        str.Append("の");
                        str.Append(ToString(exponentialPart));
                        str.Append(IsKana ? "じょう" : "乗");
                    }
                }
            }

            return(str.ToString());
        }
Esempio n. 2
0
        /// <summary>
        /// Gets the string of a specific number.
        /// </summary>
        /// <param name="number">The number.</param>
        /// <returns>A string for the number.</returns>
        public string ToString(double number)
        {
            if (double.IsNaN(number))
            {
                return("not a number");
            }
            if (number > 0)
            {
                if (number < 1)
                {
                    if (number == 0.5)
                    {
                        return("a half");
                    }
                    if (number == 1 / 3)
                    {
                        return("a third");
                    }
                    if (number == 0.25)
                    {
                        return("a quarter");
                    }
                    if (number == 0.2)
                    {
                        return("a fifth");
                    }
                    if (number == 0.1)
                    {
                        return("ten percents");
                    }
                    if (number == 0.01)
                    {
                        return("a percent");
                    }
                }

                if (number <= ulong.MaxValue)
                {
                    var numInt = (ulong)number;
                    if (numInt == number)
                    {
                        return(ToString(numInt));
                    }
                    if (number == 1.5)
                    {
                        return("a half and one");
                    }
                    if (number == 1.25)
                    {
                        return("a half and a quarter");
                    }
                    if (number == 1.2)
                    {
                        return("a half and a fifth");
                    }
                }
                else if (double.IsPositiveInfinity(number))
                {
                    return("positive infinity");
                }
            }
            else if (number > long.MinValue)
            {
                var numAbs = Math.Abs(number);
                var numInt = (ulong)numAbs;
                if (numInt == numAbs)
                {
                    return(NegativeSign + ToString(numInt));
                }
            }
            else if (double.IsNegativeInfinity(number))
            {
                return("negative infinity");
            }

            var str = new StringBuilder();

            var(integerPart, fractionalPart, exponentialPart) = NumberSymbols.SplitNumber(number);
            str.Append(ToString(integerPart, false));
            if (fractionalPart.Length > 0)
            {
                str.Append(" point ");
                str.Append(GetAllDigitsString(fractionalPart, fractionalPart.Length));
            }

            if (exponentialPart > 0)
            {
                switch (exponentialPart)
                {
                case 1:
                    str.Append(" times ten");
                    break;

                case 2:
                    str.Append(" hundred");
                    break;

                case 3:
                    str.Append(" thousand");
                    break;

                case 6:
                    str.Append(" million");
                    break;

                case 9:
                    str.Append(" billion");
                    break;

                case 12:
                    str.Append(" trillion");
                    break;

                default:
                    str.Append(" times ten of ");
                    str.Append(ToString(exponentialPart));
                    str.Append(" power");
                    break;
                }
            }

            return(str.ToString());
        }
Esempio n. 3
0
        /// <summary>
        /// Gets the string of a specific number.
        /// </summary>
        /// <param name="number">The number.</param>
        /// <returns>A string for the number.</returns>
        public string ToString(double number)
        {
            if (double.IsNaN(number))
            {
                return(IsTraditional ? "不是數字" : "不是数字");
            }
            if (number > 0)
            {
                if (number <= ulong.MaxValue)
                {
                    var numInt = (ulong)number;
                    if (numInt == number)
                    {
                        return(ToString(numInt));
                    }
                }
                else if (double.IsPositiveInfinity(number))
                {
                    return(IsTraditional ? "正無窮" : "正无穷");
                }
            }
            else if (number > long.MinValue)
            {
                var numAbs = Math.Abs(number);
                var numInt = (ulong)numAbs;
                if (numInt == numAbs)
                {
                    return(NegativeSign + ToString(numInt));
                }
            }
            else if (double.IsNegativeInfinity(number))
            {
                return(IsTraditional ? "負無窮" : "负无穷");
            }

            var str = new StringBuilder();

            var(integerPart, fractionalPart, exponentialPart) = NumberSymbols.SplitNumber(number);
            str.Append(ToString(integerPart, false));
            if (fractionalPart.Length > 0)
            {
                str.Append(IsTraditional ? "點" : "点");
                foreach (var item in fractionalPart)
                {
                    str.Append(digits[int.Parse(item.ToString())]);
                }
            }

            if (exponentialPart > 0)
            {
                if (exponentialPart % 4 == 0 && exponentialPart < 41)
                {
                    if (exponentialPart % 8 == 4)
                    {
                        str.Append(digits[13]);
                    }
                    else
                    {
                        str.Append(digits[14], exponentialPart / 8);
                    }
                }
                else
                {
                    str.Append("乘以");
                    str.Append(TenClass);
                    if (exponentialPart > 1)
                    {
                        str.Append("的");
                        str.Append(ToString(exponentialPart));
                        str.Append("次方");
                    }
                }
            }

            return(str.ToString());
        }