转换字符串中的数字,最后是负号

时间:2014-09-12 13:25:23

标签: c# numbers

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

所以我试过了:

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

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

2 个答案:

答案 0 :(得分:5)

这里不需要格式 - 看起来NumberNegativePattern仅用于格式化,而不是解析,然后仅用于N格式。但是,此值为NumberStyles

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

答案 1 :(得分:2)

您的NumberFormatInfo NumberNegativePattern已分配给3,但NumberFormatInfo的其他属性将取决于您的CurrentCulture。但那并非如此。

Convert.ToDouble(String, IFormatProvider)方法implemented as;

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

Double.Parse(String, IFormatProvider)实施为;

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小千位分隔符,但您可以使用AllowDecimalPointAllowThousands AllowTrailingSign样式的样式作为Double.Parse(String, NumberStyles) overload的第二个参数。