正在转换末尾带有负号的字符串中的数字

本文关键字:字符串 数字 转换 | 更新日期: 2023-09-27 18:21:43

在MSDN文档中,我应该使用NumberFormatInfoNumberNegativePattern属性来设置负数值的预期模式。

所以我尝试了:

var format = new NumberFormatInfo {NumberNegativePattern = 3};
Console.WriteLine(Convert.ToDouble("1.000-", format));

但我总是收到一个FormatException,说"输入字符串的格式不正确。"。我还尝试使用NumberFormatInfo.InvariantInfo进行格式化,结果相同。

正在转换末尾带有负号的字符串中的数字

这里不需要格式-看起来NumberNegativePattern只在格式化时使用,而不是解析,然后只用于N格式。然而,这有一个NumberStyles值:

Console.WriteLine(double.Parse("1.000-", 
    NumberStyles.AllowTrailingSign | NumberStyles.AllowDecimalPoint));

您的NumberFormatInfoNumberNegativePattern被分配给3,但NumberFormatInfo的其他属性将取决于CurrentCulture。但这不是重点。

Convert.ToDouble(String, IFormatProvider)方法实现为;

public static double ToDouble(String value)
{
    if (value == null)
        return 0;
    return Double.Parse(value, CultureInfo.CurrentCulture);
}

以及CCD_ 9实现为;

public static double Parse(String s, IFormatProvider provider)
{
   return Parse(s, NumberStyles.Float| NumberStyles.AllowThousands, NumberFormatInfo.GetInstance(provider));
}

NumberStyles.Float没有NumberStyles.AllowTrailingSign,这就是您的代码抛出FormatException的原因。

很难判断您的1.000值是带小数点的1还是带千位分隔符的1000,但您可以使用带有AllowTrailingSign样式的AllowDecimalPointAllowThousands样式作为Double.Parse(String, NumberStyles)重载的第二个参数。