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