public static string NumberToString(string format, NumberStore ns, NumberFormatInfo nfi, char specifier, int precision, bool custom) { if (ns.IsNaN) { return nfi.NaNSymbol; } if (ns.IsInfinity) { if (ns.Positive) return nfi.PositiveInfinitySymbol; else return nfi.NegativeInfinitySymbol; } if (nfi == null) nfi = NumberFormatInfo.GetInstance(null); if (custom) { if (ns.IsFloatingSource) ns.RoundEffectiveDigits(ns.DefaultPrecision); return FormatCustom(format, ns, nfi); } if (ns.IsFloatingSource) { switch (specifier) { case 'p': case 'P': case 'c': case 'C': case 'f': case 'F': case 'N': case 'n': ns.RoundEffectiveDigits(ns.DefaultPrecision); break; case 'g': case 'G': if (precision <= 0) ns.RoundEffectiveDigits(ns.DefaultPrecision, ns.IsBankerApplicable, true); else ns.RoundEffectiveDigits(precision); break; case 'r': case 'R': ns.RoundEffectiveDigits(ns.DefaultMaxPrecision); break; default: if (precision > ns.DefaultPrecision) ns.RoundEffectiveDigits(precision + 1); else ns.RoundEffectiveDigits(ns.DefaultPrecision + 1); break; } } switch (specifier) { case 'c': case 'C': return FormatCurrency(ns, precision, nfi); case 'd': case 'D': return FormatDecimal(ns, precision, nfi); case 'e': case 'E': return FormatExponential(ns, precision, nfi, specifier == 'E'); case 'f': case 'F': return FormatFixedPoint(ns, precision, nfi); case 'g': case 'G': if (ns.IsFloatingSource || ns.IsDecimalSource || precision != -1) return FormatGeneral(ns, precision, nfi, specifier == 'G', false); return FormatDecimal(ns, precision, nfi); case 'n': case 'N': return FormatNumber(ns, precision, nfi); case 'p': case 'P': return FormatPercent(ns, precision, nfi); case 'r': case 'R': if (ns.IsFloatingSource) { return FormatGeneral(ns, ns.DefaultPrecision, nfi, true, true); } else { throw new FormatException("The specified format cannot be used in this instance"); } default: throw new FormatException("The specified format '" + format + "' is invalid"); } }