【问题标题】:Why does NumberStyles.AllowThousands work for int.Parse but not for double.Parse in this example?在这个例子中,为什么 NumberStyles.AllowThousands 对 int.Parse 有效,但对 double.Parse 无效?
【发布时间】:2017-08-31 14:54:54
【问题描述】:

为了解析一个代表数字的字符串,用逗号分隔千位,我试过了

int tmp1 = int.Parse("1,234", NumberStyles.AllowThousands);
double tmp2 = double.Parse("1,000.01", NumberStyles.AllowThousands);

第一个语句执行没有问题,而第二个语句失败并出现异常:

“System.FormatException”类型的未处理异常发生在 mscorlib.dll

附加信息:输入字符串的格式不正确。

为什么两者都不成功?

【问题讨论】:

    标签: c#


    【解决方案1】:

    您应该传递AllowDecimalPointFloatNumber 样式(后两种样式只是几个数字样式的组合,其中包括AllowDecimalPoint 标志):

    double.Parse("1,000.01", NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint)
    

    当您为解析方法提供一些数字样式时,您指定 exact 可以出现在字符串中的元素样式。不包括在内的样式被认为是不允许的。用于解析双精度值的默认标志组合(当您未明确指定样式时)是 NumberStyles.FloatNumberStyles.AllowThousands 标志。

    考虑您的第一个解析整数示例 - 您尚未传递 AllowLeadingSign 标志。因此下面的代码会抛出异常:

    int.Parse("-1,234", NumberStyles.AllowThousands)
    

    对于此类数字,应添加AllowLeadingSign 标志:

    int.Parse("-1,234", NumberStyles.AllowThousands | NumberStyles.AllowLeadingSign)
    

    【讨论】:

    • 谢谢。你能解释一下为什么我必须通过另一个标志吗?
    • 更好的是,添加到默认值。对于int,那是NumberStyles.Integer,所以int.Parse("-1,234", NumberStyles.Integer | NumberStyles.AllowThousands) 应该可以工作。
    • @Tim,在这里从臀部拍摄,但这是因为不同的文化使用 ,. 与您使用的相反。在美国,“一千零一”表示为1,000.1,而在某些文化中则表示为1.000,1。指定这些附加标志有助于解析器确定如何解析值。
    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多