Double.TryParse,带有两个小数点的字符串

时间:2013-10-22 13:50:09

标签: c# double

这可能是一个简单而基本的问题,但是,想到与你确认。我正在编写代码来验证输入的文本信息是否是双倍。在我的代码中,下面是验证从文本框中获取的速度值的行。

    double _mSpeed = 0.0;
    if (!Double.TryParse(txtboxSpeed.Text, out _mSpeed))
               throw new Exception("Input value for Speed is invalid !!!");

但是,如果用户在速度文本框中提供 4.4.4 ,则TryParse会将文本字符串解析为 444.0 值。我想知道这是否正确。请分享您的想法,无论用户是否输入带有2个小数点的任何值,如果它不解析为双倍或预期的行为是什么。

3 个答案:

答案 0 :(得分:7)

.是小数点分隔符的文化中,如en-US和不变文化,4.4.4无效。在其他文化中,例如de-DE,是小数点分隔符,.是千位分隔符,因此4.4.4444(非标准但可接受,插入了数千个分隔符,例如4,4,4文化中的en-US

double.Parse("4.4.4", new CultureInfo("de-DE")) // 444
double.Parse("4.4.4", new CultureInfo("en-US")) // FormatException: Input string was not in a correct format.
double.Parse("4,4,4", new CultureInfo("en-US")) // 444
double.Parse("4,4,4", new CultureInfo("de-DE")) // FormatException: Input string was not in a correct format.

答案 1 :(得分:1)

问题可能是您的应用程序当前使用的文化将逗号视为小数分隔符而不是句点。您可以通过将culture设置为en-GB来强制它将句点用作小数分隔符。

double _mSpeed = 0.0;
if (!Double.TryParse(txtboxSpeed.Text,NumberStyles.Any,CultureInfo.CreateSpecificCulture("en-GB"), out _mSpeed))
           throw new Exception("Input value for Speed is invalid !!!");

答案 2 :(得分:1)

您可以只指定CultureInfo,而不是为使用您的数字格式的特定文化(例如“en-US”)创建NumberFormatInfo.InvariantInfo

 double val1, val2;     
 bool b1 = double.TryParse("4.4.4", NumberStyles.Any, NumberFormatInfo.InvariantInfo, out val1);
 bool b2 = double.TryParse("4,444.4", NumberStyles.Any, NumberFormatInfo.InvariantInfo, out val2);

在上面的代码中,b1设置为false,但b2成功,val24444.4