26

"0"次のように、値( System.String) をそのBoolean表現に変換しようとしています。

var myValue = Convert.ToBoolean("0"); // throwing an exception here

MSDN のページを確認したところ、コード サンプル ブロックに次の行が見つかりました。

ConvertToBoolean("0");
// ...
Unable to convert '0' to a Boolean.

私のコードでは、 から次のように変換していSystem.StringますBoolean

// will be OK, but ugly code
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
  • Booleanそのような醜いコードではない型に変換する他の方法はありますか?
  • なぜこのような例外が発生するのでしょうか? System.String参照型から値型に変換したため、System.BooleanSystem.Int32値型ですね。
4

9 に答える 9

68

これはConvert.ToBoolean、 が次のいずれかを予期しているために発生しています。

のその他値は無効ですBoolean

あなたはすでにきれいなアプローチを持っています:

var myValue = Convert.ToBoolean(Convert.ToInt32("0"));

編集:変換を処理する醜さを隠しながら、これらのケースのいくつかを処理する拡張メソッドを作成できます。

この拡張機能は、次の非常に大まかな解釈を提供しますBoolean

  • "True"(文字列) =true
  • "False"(文字列) =false
  • "0"(文字列) =false
  • その他の文字列 =true

コード:

public static class Extensions
{
    public static Boolean ToBoolean(this string str)
    {
        String cleanValue = (str ?? "").Trim();
        if (String.Equals(cleanValue, "False", StringComparison.OrdinalIgnoreCase))
            return false;
        return
            (String.Equals(cleanValue, "True", StringComparison.OrdinalIgnoreCase)) ||
            (cleanValue != "0");
    }
}

または、より厳密なアプローチが必要な場合は、.NET Framework が期待するものに従います。次に、try/catchステートメントを使用します。

public static class Extensions
{
    public static Boolean ToBoolean(this string str)
    {
        try
        {
            return Convert.ToBoolean(str);
        }
        catch { }
        try
        {
            return Convert.ToBoolean(Convert.ToInt32(str));
        }
        catch { }
        return false;
    }
}

Albeit, not a clean or pretty approach, but it guarantees more possibilities of getting the correct value. And, the Extensions class is tucked away from your data/business code.

In the end, your conversion code is relatively simple to use:

String myString = "1";
Boolean myBoolean = myString.ToBoolean();
于 2013-04-25T02:33:47.780 に答える
1

int になることがわかっている場合は、int に変換してから bool に変換できます。以下は、文字列を試行してから数値を試行することにより、bool への変換を試みます。

public bool ToBoolean(string value)
{
  var boolValue = false;
  if (bool.TryParse(value, out boolValue ))
  {
    return boolValue;
  }

  var number = 0;
  int.TryParse(value, out number))
  return Convert.ToBoolean(number);
}
于 2013-04-25T02:40:36.700 に答える
0

これは、最初の文字をキーオフする非常に寛容なパーサーです。

public static class StringHelpers
{
    /// <summary>
    /// Convert string to boolean, in a forgiving way.
    /// </summary>
    /// <param name="stringVal">String that should either be "True", "False", "Yes", "No", "T", "F", "Y", "N", "1", "0"</param>
    /// <returns>If the trimmed string is any of the legal values that can be construed as "true", it returns true; False otherwise;</returns>
    public static bool ToBoolFuzzy(this string stringVal)
    {
        string normalizedString = (stringVal?.Trim() ?? "false").ToLowerInvariant();
        bool result = (normalizedString.StartsWith("y") 
            || normalizedString.StartsWith("t")
            || normalizedString.StartsWith("1"));
        return result;
    }
}
于 2015-11-03T18:14:56.480 に答える
0

手遅れですが、他の誰かが同じものを探している場合は、これを短く簡単に試すことができます

return (string!= "0")

于 2021-07-18T10:14:33.110 に答える