如何在c#中不区分大小写地解析浮点数和双精度数(以涵盖“无穷大”等)
本文关键字:无穷大 双精度 浮点数 不区 大小写 | 更新日期: 2023-09-27 18:18:35
在我的语言环境中,double.Parse("Infinity")
返回double.PositiveInfinity
,但double.Parse("infinity")
抛出System.FormatException
。类似的事情也发生在负无穷和NaN上。
我显然可以在调用double.Parse()
之前使用CultureInfo.CurrentCulture.NumberFormat.PositiveInfinitySymbol.Equals()
与不区分大小写的比较来检查匹配(并且对负无穷大和NaN也这样做)。然而,我希望有更优雅的东西
除了执行TryParse()
之外,我没有看到太多选择,如果失败,则对三个特殊标记进行特殊大小写,如Number.ParseDouble()
和double.TryParse()
所示。我将在之后而不是之前进行检查,因为在大多数情况下,这不会发生。
查看double的Parse
方法,它看起来没有太多的回旋余地:
// 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
方法不允许您更改大小写敏感性,因此我认为您应该在分析的自定义扩展中进行研究,也许可以在string
之上添加AsDouble
方法。
您想要支持当前区域性的名称,所以如果它是"de-DE" "+unendlich"
应该被成功检测为PositiveInfinitySymbol
?不清楚输入是否由你控制。
:
如果用户的
CurrentCulture
是"de-DE",我想要"+unendlich"(即PositiveInfinitySymbol
)成功解析为double.PositiveInfinity
。我还想要"+Unendlich"answers"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);