コード例 #1
0
		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");
			}
		}