В моей локали double.Parse("Infinity")
возвращает double.PositiveInfinity
, но double.Parse("infinity")
выдает System.FormatException
. Аналогичные вещи происходят для отрицательной бесконечности и NaN.
Я мог бы просто использовать CultureInfo.CurrentCulture.NumberFormat.PositiveInfinitySymbol.Equals()
с нечувствительным к регистру сравнением для проверки соответствия перед вызовом double.Parse()
(и делать аналогично для отрицательной бесконечности и NaN). Однако я надеялся на что-то более элегантное.
Я не вижу много вариантов, кроме TryParse()
, и при сбое Number.ParseDouble()
три специальных Number.ParseDouble()
как показано в Number.ParseDouble()
и double.TryParse()
. Я бы сделал чек после, а не раньше, так как в большинстве случаев этого не произойдет.
Глядя на метод Parse
for double, это не похоже, что у вас много комнаты для маневра:
// double
private static double Parse(string s, NumberStyles style, NumberFormatInfo info)
{
double result;
try
{
result = Number.ParseDouble(s, style, info);
}
catch (FormatException)
{
string text = s.Trim();
if (text.Equals(info.PositiveInfinitySymbol)) // case-sensitive comparison
{
result = double.PositiveInfinity;
}
else
{
if (text.Equals(info.NegativeInfinitySymbol)) // case-sensitive comparison
{
result = double.NegativeInfinity;
}
else
{
if (!text.Equals(info.NaNSymbol)) // case-sensitive comparison
{
throw;
}
result = double.NaN;
}
}
}
return result;
}
Поскольку метод Equals
который используется здесь, не позволяет вам изменять чувствительность к регистру, я думаю, что вам следует исследовать в пользовательских расширениях для вашего синтаксического анализа, возможно, добавив метод AsDouble
поверх string
.
Вы хотите поддерживать имена текущей культуры, поэтому, если это "de-DE" "+unendlich"
должно быть успешно обнаружено как PositiveInfinitySymbol
? Не понятно, контролируется ли вход вами или нет.
Вы:
Если пользователь
CurrentCulture
"de-DE", мне бы хотелось, чтобы "+unendlich" (который былPositiveInfinitySymbol
) успешно анализировался какdouble.PositiveInfinity
. Мне также хотелось бы, чтобы "+unendlich" и "UNENDLICH" проанализировали одну и ту же ценность.
Тогда ваш подход абсолютно прекрасен, не так ли? Вы можете написать такой метод:
public static bool ParseDoubleExt(string input, out double doubleVal, StringComparison comparison = StringComparison.CurrentCultureIgnoreCase, NumberFormatInfo nfi = null)
{
if (nfi == null)
nfi = NumberFormatInfo.CurrentInfo;
doubleVal = double.MinValue;
double d;
if (double.TryParse(input, out d))
{
doubleVal = d;
return true;
}
else
{
bool isPosInf = nfi.PositiveInfinitySymbol.Equals(input, comparison);
if (isPosInf)
{
d = double.PositiveInfinity;
return true;
}
bool isNegInf = nfi.NegativeInfinitySymbol.Equals(input, comparison);
if (isNegInf)
{
d = double.NegativeInfinity;
return true;
}
bool isNAN = nfi.NaNSymbol.Equals(input, comparison);
if (isNAN)
{
d = double.NaN;
return true;
}
// to be extended ...
}
return false;
}
и использовать его таким образом:
string doubleStr = "+UNENDLICH";
double d;
bool success = ParseDoubleExt(doubleStr, out d);
CurrentCulture
?