1

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

    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 个小数点的值,它是否应该解析为 double 或预期的行为是什么。

4

3 回答 3

7

.小数点分隔符的文化中,如en-US和不变的文化,4.4.4是无效的。在其他文化中,例如de-DE,是小数分隔符,.是千位分隔符,也是如此4.4.4444插入非标准但可接受的千位分隔符,就像4,4,4en-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.
于 2013-10-22T13:54:18.557 回答
1

问题可能是您的应用程序当前使用的文化将逗号视为小数分隔符而不是句点。您可以通过将文化设置为 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 !!!");
于 2013-10-22T13:59:49.790 回答
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中设置为falseb2成功并且val24444.4.

于 2013-10-22T14:10:04.550 回答