Ejemplo n.º 1
0
        /// <summary>
        /// Converts a number to the string of approximation.
        /// </summary>
        /// <param name="number">The number to convert.</param>
        /// <param name="accuracy">A nature number for accuracy of the number.</param>
        /// <returns>A string format number.</returns>
        /// <exception cref="ArgumentOutOfRangeException">accuracy is less than 0 or is greater than 32.</exception>
        public string ToApproximationString(ulong number, int accuracy = 1)
        {
            if (accuracy < 0 || accuracy > 32)
            {
                throw new ArgumentOutOfRangeException(nameof(accuracy));
            }
            var levels = number.ToString(CultureInfo.InvariantCulture).Length / GroupLength;

            if (levels < 1)
            {
                return(ConvertString(number.ToString()));
            }
            var len    = levels * GroupLength;
            var format = new StringBuilder("0.");

            format.Append('0', Math.Min(accuracy, len));
            var num = new StringBuilder((number * 1.0 / Math.Pow(10, len)).ToString(format.ToString(), CultureInfo.InvariantCulture));

            if ((number / Math.Pow(10, len)).ToString(CultureInfo.InvariantCulture).Length == 4)
            {
                num.Insert(1, ',');
            }
            if (levels > 12)
            {
                num.AppendFormat("×10{0}", NumberSymbols.ToExponentString(levels * GroupLength));
            }
            else
            {
                num.Append(digits[12 + levels]);
            }

            return(ConvertString(num));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Converts a number to the string of approximation.
        /// </summary>
        /// <param name="number">The number to convert.</param>
        /// <param name="accuracy">A nature number for accuracy of the number.</param>
        /// <returns>A string format number.</returns>
        /// <exception cref="ArgumentOutOfRangeException">accuracy is less than 0 or is greater than 32.</exception>
        public string ToApproximationString(ulong number, int accuracy = 1)
        {
            if (accuracy < 0 || accuracy > 32)
            {
                throw new ArgumentOutOfRangeException(nameof(accuracy));
            }
            var levels = Math.Abs(number.ToString(CultureInfo.InvariantCulture).Length) / GroupLength;

            if (levels < 1)
            {
                return(number.ToString());
            }
            var len    = levels * GroupLength;
            var format = new StringBuilder("0.");

            format.Append('0', Math.Min(accuracy, len));
            var num = (number * 1.0 / Math.Pow(10, len)).ToString(format.ToString(), CultureInfo.InvariantCulture);

            switch (levels)
            {
            case 1:
                return(num + "K");

            case 2:
                return(num + "M");

            case 3:
                return(num + "G");

            case 4:
                return(num + "T");

            case 5:
                return(num + "P");

            case 6:
                return(num + "E");

            case 7:
                return(num + "Z");

            case 8:
                return(num + "Y");

            default:
                return(string.Format("{0}×10{1}", num, NumberSymbols.ToExponentString(levels * GroupLength)));
            }
        }
Ejemplo 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("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());
        }
Ejemplo n.º 4
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());
        }
Ejemplo n.º 5
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());
        }