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

本文关键字:两个 小数点 字符串 TryParse Double | 更新日期: 2023-09-27 18:36:28

这可能是

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

    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.TryParse,带有两个小数点的字符串

. 是小数分隔符的区域性(如 en-US 和固定区域性)中,4.4.4 无效。在其他区域性(如 de-DE 中,, 是小数分隔符,. 是千位分隔符,因此4.4.4444的(插入非标准但可接受的千位分隔符,如en-US区域性中的4,4,4)。

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.

问题可能是应用程序当前使用的区域性将逗号视为小数分隔符而不是句点。您可以通过将区域性设置为 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 !!!");

除了为使用数字格式的特定区域性创建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成功并且val2 4444.4