public string FormatCustom (string format, NumberFormatInfo nfi)
{
bool p = _positive;
int offset = 0;
int length = 0;
CustomInfo.GetActiveSection (format, ref p, IsZero, ref offset, ref length);
if (length == 0)
return _positive ? string.Empty : nfi.NegativeSign;
_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)
Multiply10(2 * info.Percents);
if (info.Permilles > 0)
Multiply10(3 * info.Permilles);
if (info.DividePlaces > 0)
Divide10(info.DividePlaces);
bool expPositive = true;
if (info.UseExponent && (info.DecimalDigits > 0 || info.IntegerDigits > 0)) {
if (!IsZero) {
RoundPos (info.DecimalDigits + info.IntegerDigits);
diff -= _decPointPos - info.IntegerDigits;
_decPointPos = info.IntegerDigits;
}
expPositive = diff <= 0;
AppendNonNegativeNumber (sb_exp, diff < 0 ? -diff : diff);
}
else
RoundDecimal (info.DecimalDigits);
if (info.IntegerDigits != 0 || !IsZeroInteger)
AppendIntegerString (IntegerDigits, sb_int);
AppendDecimalString (DecimalDigits, sb_dec);
if (info.UseExponent) {
if (info.DecimalDigits <= 0 && info.IntegerDigits <= 0)
_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 && 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, _positive, sb_int, sb_dec, sb_exp);
}
#endregion public number formatting methods