web-dev-qa-db-ja.com

Convert.ToBooleanが「0」値で失敗する

値を変換しようとしています"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.Boolean、 だが System.Int32も値型ですよね?
22
Secret

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

すべてのother値はBooleanに対して無効です。

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

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

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

この拡張機能は、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;
    }
}

とはいえ、cleanまたはprettyアプローチではありませんが、正しい値を取得できる可能性が増えることを保証します。また、Extensionsクラスはデータ/ビジネスコードから隠れています。

最終的に、変換コードは比較的簡単に使用できます。

String myString = "1";
Boolean myBoolean = myString.ToBoolean();
58
Jesse
public static class BooleanParser
{
    public static bool SafeParse(string value)
    {
        var s = (value ?? "").Trim().ToLower();
        return s == "true" || s == "1";
    }
}

static readonly HashSet<string> _booleanTrueStrings = new HashSet<string> { "true", "yes", "1" };
static readonly HashSet<string> _booleanFalseStrings = new HashSet<string> { "false", "no", "0" };

public static bool ToBoolean(string value)
{
    var v = value?.ToLower()?.Trim() ?? "";
    if (_booleanTrueStrings.Contains(v)) return true;
    if (_booleanFalseStrings.Contains(v)) return false;
    throw new ArgumentException("Unexpected Boolean Format");
}
7
ChaosPandion

まだこれらの変換などを行うのは本当に問題なので、拡張メソッドはどうですか?

public static class Extensions {
    public static bool ToBool(this string s) {
        return s == "0" ? false : true;
    }
}

そのため、次のように使用します。

"0".ToBool();

必要に応じてこのメソッドを簡単に拡張して、さらに多くのケースを処理できるようになりました。

3
Mike Perrenoud

十分に速くて簡単:

public static class Extensions
{
        static private List<string> trueSet = new List<string> { "true","1","yes","y" };

        public static Boolean ToBoolean(this string str)
        {
            try
            { return trueSet.Contains(str.ToLower()); }
            catch { return false; }
        }
}
1
user369122

変換が正常に行われるためには、値パラメーターは Boolean.TrueString 、値がTrueである定数、 Boolean.FalseString 、値がFalseである定数、またはヌルでなければなりません。 Boolean.TrueStringおよびBoolean.FalseStringと値を比較する場合、メソッドは大文字と小文字、および先頭と末尾の空白を無視します。

from [〜#〜] msdn [〜#〜]

なぜならConvert.ToBooleanは、値がゼロでない場合、 trueを期待します。そうでない場合はfalse。 数値およびTrueまたはFalseString値。

1
Pyromancer

Intになることがわかっている場合は、intから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);
}
1
loopedcode
    public static bool GetBoolValue(string featureKeyValue)
    {
        if (!string.IsNullOrEmpty(featureKeyValue))
        {
                    try 
                    {
                        bool value;
                        if (bool.TryParse(featureKeyValue, out value))
                        {
                            return value;
                        }
                        else
                        {
                            return Convert.ToBoolean(Convert.ToInt32(featureKeyValue));
                        }
                    }
                    catch
                    {
                        return false;
                    }
         }
         else
         {
                  return false;
         }
   }

次のように呼び出すことができます-:

GetBoolValue("TRUE") // true
GetBoolValue("1") // true
GetBoolValue("") // false
GetBoolValue(null) // false
GetBoolValue("randomString") // false
0
Priyank Kotiyal

最初の文字をキーオフする非常に寛容なパーサーを次に示します。

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;
    }
}
0
Mark Meuer