Ejemplo n.º 1
0
		internal static string FormatCustom(string format, NumberStore ns, NumberFormatInfo nfi)
		{
			bool p = ns.Positive;
			int offset = 0;
			int length = 0;
			CustomInfo.GetActiveSection(format, ref p, ns.ZeroOnly, ref offset, ref length);
			if (length == 0)
			{
				return ns.Positive ? String.Empty : nfi.NegativeSign;
			}
			ns.Positive = p;

			CustomInfo info = CustomInfo.Parse(format, offset, length, nfi);
#if false
			Console.WriteLine("Format : {0}",format);
			Console.WriteLine("DecimalDigits : {0}",info.DecimalDigits);
			Console.WriteLine("DecimalPointPos : {0}",info.DecimalPointPos);
			Console.WriteLine("DecimalTailSharpDigits : {0}",info.DecimalTailSharpDigits);
			Console.WriteLine("IntegerDigits : {0}",info.IntegerDigits);
			Console.WriteLine("IntegerHeadSharpDigits : {0}",info.IntegerHeadSharpDigits);
			Console.WriteLine("IntegerHeadPos : {0}",info.IntegerHeadPos);
			Console.WriteLine("UseExponent : {0}",info.UseExponent);
			Console.WriteLine("ExponentDigits : {0}",info.ExponentDigits);
			Console.WriteLine("ExponentTailSharpDigits : {0}",info.ExponentTailSharpDigits);
			Console.WriteLine("ExponentNegativeSignOnly : {0}",info.ExponentNegativeSignOnly);
			Console.WriteLine("DividePlaces : {0}",info.DividePlaces);
			Console.WriteLine("Percents : {0}",info.Percents);
			Console.WriteLine("Permilles : {0}",info.Permilles);
#endif
			StringBuilder sb_int = new StringBuilder(info.IntegerDigits * 2);
			StringBuilder sb_dec = new StringBuilder(info.DecimalDigits * 2);
			StringBuilder sb_exp = (info.UseExponent ? new StringBuilder(info.ExponentDigits * 2) : null);

			int diff = 0;
			if (info.Percents > 0)
			{
				ns.Multiply10(2 * info.Percents);
			}
			if (info.Permilles > 0)
			{
				ns.Multiply10(3 * info.Permilles);
			}
			if (info.DividePlaces > 0)
			{
				ns.Divide10(info.DividePlaces);
			}

			bool expPositive = true;
			if (info.UseExponent && (info.DecimalDigits > 0 || info.IntegerDigits > 0))
			{
				if (!ns.ZeroOnly)
				{
					while (true)
					{
						while (ns.IntegerDigits > info.IntegerDigits)
						{
							ns.Divide10(1);
							diff--;
							if (ns.IntegerDigits == 1 && ns.GetChar(0) == '0')
								break;
						}
						while (ns.IntegerDigits < info.IntegerDigits || (ns.IntegerDigits == info.IntegerDigits && ns.GetChar(0) == '0'))
						{
							ns.Multiply10(1);
							diff++;
						}

						if (!ns.RoundDecimal(info.DecimalDigits))
							break;
					}
				}

				expPositive = diff <= 0;
				NumberStore.AppendIntegerStringFromUInt32(sb_exp, (uint)(diff >= 0 ? diff : -diff));
			}
			else
			{
				ns.RoundDecimal(info.DecimalDigits);
				if (ns.ZeroOnly)
					ns.Positive = true;
			}

			if (info.IntegerDigits != 0 || !ns.CheckZeroOnlyInteger())
			{
				ns.AppendIntegerString(ns.IntegerDigits, sb_int);
			}
			/* if (sb_int.Length > info.IntegerDigits) {
				int len = 0;
				while (sb_int.Length > info.IntegerDigits && len < sb_int.Length) {
					if (sb_int [len] == '0')
						len ++;
					else
						break;
				}
				sb_int.Remove (0, len);
			} */

			ns.AppendDecimalString(ns.DecimalDigits, sb_dec);

			if (info.UseExponent)
			{
				if (info.DecimalDigits <= 0 && info.IntegerDigits <= 0)
					ns.Positive = true;

				if (sb_int.Length < info.IntegerDigits)
					sb_int.Insert(0, "0", info.IntegerDigits - sb_int.Length);

				while (sb_exp.Length < info.ExponentDigits - info.ExponentTailSharpDigits)
					sb_exp.Insert(0, '0');

				if (expPositive && !info.ExponentNegativeSignOnly)
					sb_exp.Insert(0, nfi.PositiveSign);
				else if (!expPositive)
					sb_exp.Insert(0, nfi.NegativeSign);
			}
			else
			{
				if (sb_int.Length < info.IntegerDigits - info.IntegerHeadSharpDigits)
					sb_int.Insert(0, "0", info.IntegerDigits - info.IntegerHeadSharpDigits - sb_int.Length);
				if (info.IntegerDigits == info.IntegerHeadSharpDigits && NumberStore.IsZeroOnly(sb_int))
					sb_int.Remove(0, sb_int.Length);
			}

			ZeroTrimEnd(sb_dec, true);
			while (sb_dec.Length < info.DecimalDigits - info.DecimalTailSharpDigits)
				sb_dec.Append('0');
			if (sb_dec.Length > info.DecimalDigits)
				sb_dec.Remove(info.DecimalDigits, sb_dec.Length - info.DecimalDigits);

			return info.Format(format, offset, length, nfi, ns.Positive, sb_int, sb_dec, sb_exp);
		}
Ejemplo n.º 2
0
		internal static string FormatDecimal(NumberStore ns, int precision, NumberFormatInfo nfi)
		{
			if (ns.IsFloatingSource || ns.IsDecimalSource)
				throw new FormatException();

			precision = precision > 0 ? precision : 1;
			precision = ns.IntegerDigits > precision ? ns.IntegerDigits : precision;

			StringBuilder sb = new StringBuilder(precision + nfi.NegativeSign.Length);

			if (!ns.Positive && !ns.CheckZeroOnlyInteger())
			{
				sb.Append(nfi.NegativeSign);
			}

			ns.AppendIntegerString(precision, sb);

			return sb.ToString();
		}