2017-04-05 91 views
7

要解析表示与逗号从其它部分分开千位的数字的字符串,我想为什么NumberStyles.AllowThousands适用于int.Parse,但在本例中不适用于double.Parse?

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

第一条语句可以运行,而第二个失败,并通知

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

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

为什么两个都不成功?谢谢。

回答

12

你应该通过AllowDecimalPointFloat,或Number风格(后两种方式都只是几个数字的风格,其中包括AllowDecimalPoint标志组合):

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

当你提供一些号码的风格分析方法,你指定确切的可以出现在字符串中的元素样式。不包括的样式被认为是不允许的。标记的默认组合(当您不明确指定样式时)用于分析double值的标记为NumberStyles.FloatNumberStyles.AllowThousands标记。

考虑你的第一个解析整数的例子 - 你没有通过AllowLeadingSign标志。因此,下面的代码会抛出异常:

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

对于这样的数字,应该加入AllowLeadingSign标志:

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

感谢。你能解释为什么我必须通过另一面旗帜吗? – Tim

+0

更好的是,添加到默认值。对于'int',就是'NumberStyles.Integer',所以'int.Parse(“ - 1,234”,NumberStyles.Integer | NumberStyles.AllowThousands)'应该可以工作。 – hvd

+0

@Tim,在这里从臀部射击,但这是因为不同的文化使用','和'.'与你正在使用的相反。在美国,“千分之一”表示为“1,000.1”,在某些文化中,它表示为“1.000,1”。指定这些附加标志可帮助解析器确定如何解析该值。 – Cameron

相关问题