【问题标题】:char.isnumber('.') returns false on "en-US" localechar.isnumber('.') 在“en-US”语言环境中返回 false
【发布时间】:2017-12-03 12:21:51
【问题描述】:

我正在制作适用于 g 代码的 Windows 窗体应用程序。 基本上输入是可能看起来像这样的字符串:

X32.2Y47Z100.5

为了首先检索每个数字,我必须找出代表数字的单个子字符串有多长。

在我的加载事件中,我有这些:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");

在这些行之后,语言环境本身的值为“en-US” 但以下两个都返回 false。

char.IsNumber('.');
char.IsNumber(',');

当字符串包含“.”时,convert.toDouble() 也会失败或','。

【问题讨论】:

  • 你为什么希望它返回 true?
  • 您希望., 代表什么数字?
  • 另外,您应该使用 double.Parse 或 TryParse 而不是 Convert.ToDouble
  • 您要在这里解决的实际问题是什么。
  • 我认为这正则表达式的情况

标签: c# .net winforms


【解决方案1】:

问题是您期望字符 ., 被视为数字,而实际上它们不是。它们仅在与实际数字一起使用时才被视为有效数字的一部分,并且仅当它们的位置根据当前文化正确时。

您可以使用RegExstring.Split 方法在x、y 和z 字符上拆分字符串,然后您可以使用double.TryParse 将拆分部分转换为双精度:

private static void Main()
{
    string input = "X32.2Y47Z100.5";

    string[] inputParts = input.Split(new[] {'X', 'Y', 'Z'}, 
        StringSplitOptions.RemoveEmptyEntries);

    if (inputParts.Length == 3)
    {
        double x, y, z;
        double.TryParse(inputParts[0], out x);
        double.TryParse(inputParts[1], out y);
        double.TryParse(inputParts[2], out z);
        Console.WriteLine($"The values are: x = {x}, y = {y}, z = {z}");
    }
    else
    {
        Console.WriteLine("Input was not in a valid format.");
    }

    Console.WriteLine("\nDone!\nPress any key to exit...");
    Console.ReadKey();
}

输出

【讨论】:

    【解决方案2】:
    1. 使用正则表达式,将所有字母替换为“;”

      Regex.Replace(YourInputString, "[^0-9.,]", ";")
      
    2. 用“;”分割结果

      var YourInputStringArray = YourInputString.Split(';')
      
    3. 删除所有空条目

      YourInputStringArray =  YourInputStringArray .Where(x => !string.IsNullOrEmpty(x)).ToArray();
      
    4. 将其转换为双倍

      foreach(var inputString in YourInputStringArray)
      {
         if(double.TryParse(inputString, out var result)){
             // Here is your double value
         }
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2020-04-18
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多