public static CustomInfo Parse (string format, int offset, int length, NumberFormatInfo nfi)
{
char literal = '\0';
bool integerArea = true;
bool decimalArea = false;
bool exponentArea = false;
bool sharpContinues = true;
CustomInfo info = new CustomInfo ();
int groupSeparatorCounter = 0;
for (int i = offset; i - offset < length; i++) {
char c = format [i];
if (c == literal && c != '\0') {
literal = '\0';
continue;
}
if (literal != '\0')
continue;
if (exponentArea && (c != '\0' && c != '0' && c != '#')) {
exponentArea = false;
integerArea = (info.DecimalPointPos < 0);
decimalArea = !integerArea;
i--;
continue;
}
switch (c) {
case '\\':
i++;
continue;
case '\'':
case '\"':
if (c == '\"' || c == '\'') {
literal = c;
}
continue;
case '#':
if (sharpContinues && integerArea)
info.IntegerHeadSharpDigits++;
else if (decimalArea)
info.DecimalTailSharpDigits++;
else if (exponentArea)
info.ExponentTailSharpDigits++;
goto case '0';
case '0':
if (c != '#') {
sharpContinues = false;
if (decimalArea)
info.DecimalTailSharpDigits = 0;
else if (exponentArea)
info.ExponentTailSharpDigits = 0;
}
if (info.IntegerHeadPos == -1)
info.IntegerHeadPos = i;
if (integerArea) {
info.IntegerDigits++;
if (groupSeparatorCounter > 0)
info.UseGroup = true;
groupSeparatorCounter = 0;
}
else if (decimalArea)
info.DecimalDigits++;
else if (exponentArea)
info.ExponentDigits++;
break;
case 'e':
case 'E':
if (info.UseExponent)
break;
info.UseExponent = true;
integerArea = false;
decimalArea = false;
exponentArea = true;
if (i + 1 - offset < length) {
char nc = format [i + 1];
if (nc == '+')
info.ExponentNegativeSignOnly = false;
if (nc == '+' || nc == '-')
i++;
else if (nc != '0' && nc != '#') {
info.UseExponent = false;
if (info.DecimalPointPos < 0)
integerArea = true;
}
}
break;
case '.':
integerArea = false;
decimalArea = true;
exponentArea = false;
if (info.DecimalPointPos == -1)
info.DecimalPointPos = i;
break;
case '%':
info.Percents++;
break;
case '\u2030':
info.Permilles++;
break;
case ',':
if (integerArea && info.IntegerDigits > 0)
groupSeparatorCounter++;
break;
default:
break;
}
}
if (info.ExponentDigits == 0)
info.UseExponent = false;
else
info.IntegerHeadSharpDigits = 0;
if (info.DecimalDigits == 0)
info.DecimalPointPos = -1;
info.DividePlaces += groupSeparatorCounter * 3;
return info;
}