Найдя этот вопрос во время поиска аналогичного ответа, но не найдя ни одного из ответов, полностью соответствующих тому, что мне было нужно, я написал следующее, так как он хорошо обрабатывает признаки и быстрее дает сбой, если получить очень длинную строку. Это не значит, игнорировать любые символы группировки, такие как ,
, '
, ’
, хотя их можно легко добавить, если кто-то захочет (а я нет):
public static int ParseIntInternational(this string str)
{
int result = 0;
bool neg = false;
bool seekingSign = true; // Accept sign at beginning only.
bool done = false; // Accept whitespace at beginning end or between sign and number.
// If we see whitespace once we've seen a number, we're "done" and
// further digits should fail.
for(int i = 0; i != str.Length; ++i)
{
if(char.IsWhiteSpace(str, i))
{
if(!seekingSign)
done = true;
}
else if(char.IsDigit(str, i))
{
if(done)
throw new FormatException();
seekingSign = false;
result = checked(result * 10 + (int)char.GetNumericValue(str, i));
}
else if(seekingSign)
switch(str[i])
{
case '﬩': case '+':
//do nothing: Sign unchanged.
break;
case '-': case '−':
neg = !neg;
break;
default:
throw new FormatException();
}
else throw new FormatException();
}
if(seekingSign)
throw new FormatException();
return neg ? -result : result;
}