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