【问题标题】:String was not recognized as a valid boolean C#字符串未被识别为有效的布尔 C#
【发布时间】:2017-02-21 23:26:09
【问题描述】:

我收到错误“字符串未被识别为有效的布尔值”我正在使用 C# 进行编码,但似乎无法找出问题所在。任何见解将不胜感激。这是我失败的代码:

    public static SalesInfo Parse(string stringValue)
    {
        string[] words;
        SalesInfo salesInfo = new SalesInfo();

        words = StringMethods.ParseCsvString(stringValue.Trim());
        salesInfo.ID = int.Parse(words[0]);
        salesInfo.Name = words[1];
        salesInfo.City = words[2];
        salesInfo.Senior = bool.Parse(words[3]);<----Error here
        salesInfo.Veteran = bool.Parse(words[4]);
        salesInfo.PurDate = Date.Parse(words[5]);
        salesInfo.ItemPrice = Double.Parse(words[6]);
        salesInfo.Quantity = int.Parse(words[7]);

        return salesInfo;
    }

【问题讨论】:

  • words[3]的值是多少?
  • 这里的输入是什么...可能是这个stackoverflow.com/questions/24805011/…的副本
  • 是“Y”或“N”
  • 在这种情况下,错误信息完全正确,“Y”和“N”不是布尔值
  • 对……现在感觉真的很弱智。谢谢

标签: c#


【解决方案1】:

bool.Parse 只会解析“True”或“False”字符串(不区分大小写)。

bool.TryParse 的 MSDN 文档展示了可以解析的字符串类型的一个很好的示例。

如果您的输入字符串是“真实性”的其他变体,则您必须编写自己的解析器。比如:

public static SalesInfo Parse(string stringValue)
{
    ...cut for brevity...

    salesInfo.Senior = ParseBool(words[3]);

    return salesInfo;
}

public bool ParseBool(string input)
{
    switch (input.ToLower())
    {
        case "y":
        case "yes":
            return true;
        default:
            return false;
    }
}

【讨论】:

  • @Igor 我真的只是在演示这个概念,但可以肯定。
  • 我喜欢这种方法,我赞成。您也可以添加的一件事(如果 CSV 文件有“坏”数据)是为“n”、“no”等添加一个单独的案例,并让默认案例抛出一个异常,表明数据不好。
  • @EJoshuaS 是的,您肯定希望查看数据以涵盖所有“正常”基础并决定您想要的默认结果是什么,false 或类似ArgumentException
【解决方案2】:

如果其中包含“Y”/“N”,您必须执行类似于以下代码示例的操作:

void Method()
{
 string arr = new[] { "Y", "n", "N", "y"};

 foreach (string value in arr)
 {
    // If it DOES equal "y", then this is "true"; otherwise "false"
    bool boolean = value.Trim().ToLower().Equals("y");
 }
}

尝试执行bool.Parse("Y") 之类的操作肯定会引发异常。

上述代码示例的弱点在于,如果数据不正确(即它包含“Y”或“N”以外的其他内容),它将无法检测到。

public static SalesInfo Parse(string stringValue)
{
    string[] words;
    SalesInfo salesInfo = new SalesInfo();

    words = StringMethods.ParseCsvString(stringValue.Trim());
    salesInfo.ID = int.Parse(words[0]);
    salesInfo.Name = words[1];
    salesInfo.City = words[2];
    // Solution here
    salesInfo.Senior = words[3].Trim().ToLower().Equals("y");
    salesInfo.Veteran = bool.Parse(words[4]);
    salesInfo.PurDate = Date.Parse(words[5]);
    salesInfo.ItemPrice = Double.Parse(words[6]);
    salesInfo.Quantity = int.Parse(words[7]);

    return salesInfo;
}

我也非常喜欢史蒂夫的方法。一种可能的变体如下:

public bool ParseBool(string input)
{
   if (input == null)
      throw new ArgumentNullException("input");

   switch (input.ToLower())
   {
       case "y":
       case "yes":
           return true;

       case "n":
       case "no":
            return false;

       // If the CSV file is wrong (i.e. it contains "bad" data)
       default:
           return throw new ArgumentException("bad data - not a bool");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 2022-01-25
    • 1970-01-01
    • 2017-09-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多