2014-03-13 37 views
4

在C#中,为什么不能int.TryParse解析数字分组(但double.TryParse可以)?为什么不能int.TryParse解析数字分组(但double.TryParse可以)?

 int i1 = 13579; 
     string si1 = i1.ToString("N0"); //becomes 13,579 
     int i2 = 0; 
     bool result1 = int.TryParse(si1, out i2); //gets false and 0 

     double d1 = 24680.0; 
     string sd1 = d1.ToString("N0"); //becomes 24,680 
     double d2 = 0; 
     bool result2 = double.TryParse(sd1, out d2); //gets true and 24680.0 

???

回答

3

因为两种数据类型的转换因子都不相同。在字符串值中分配的参数将不同于这两种数据类型。

在Int.TryParse

不包含培养特定千个在变换参数的形式参数

例如

在Int.TryParse参数的形式是

[ws][sign]digits[ws] 

ws: White space (optional) 
sign: An optional Sign (+-) 
digit: sequance of digit (0-9) 

和在Decimal.TryParse中参数的形式是

[ws][sign][digits,]digits[.fractional-digits][ws] 

ws: White space (optional) 
sign: An optional Sign (+-) 
digit: sequance of digit (0-9) 
,: culture specific thousand separator 
.: culture specific decimal point. 
fractional-digits: fractional digit after decimal point. 

您可以从msdn中获得更多信息。 Int.TryParseDecimal.TryParse

5

您必须指定允许的NumberStyles,在将字符串解析回数字时需要考虑这一点。

确定传递给整数和浮点数值类型的Parse和TryParse方法的数字字符串参数中允许的样式。

这将返回true并存储在i2预期数量:

bool result1 = int.TryParse(si1, 
    NumberStyles.AllowThousands, CultureInfo.CurrentCulture.NumberFormat, out i2); 

你也可能想看看其他NumberStyles选项。例如,NumberStyles.Number允许数千以及小数点,空白等


int.TryParse缺省值(如果没有指定)是NumberStyles.Integer,它允许只有前导符号,以及前缘和后白空间。

double.TryParse的默认值为NumberStyles.Float| NumberStyles.AllowThousands,它允许前导符号和空格,但也允许前导符号和小数点。

相关问题