値を変換しようとしています"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
も値型ですよね?これは、Convert.ToBoolean
が次のいずれかを予期しているために発生しています。
"True"
(文字列) = true
"False"
(文字列) = false
0
(数値型、int、double、floatなど)= false
0
(数値型; ...)= true
null
= false
すべての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();
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");
}
まだこれらの変換などを行うのは本当に問題なので、拡張メソッドはどうですか?
public static class Extensions {
public static bool ToBool(this string s) {
return s == "0" ? false : true;
}
}
そのため、次のように使用します。
"0".ToBool();
必要に応じてこのメソッドを簡単に拡張して、さらに多くのケースを処理できるようになりました。
十分に速くて簡単:
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; }
}
}
変換が正常に行われるためには、値パラメーターは Boolean.TrueString
、値がTrue
である定数、 Boolean.FalseString
、値がFalse
である定数、またはヌルでなければなりません。 Boolean.TrueStringおよびBoolean.FalseStringと値を比較する場合、メソッドは大文字と小文字、および先頭と末尾の空白を無視します。
from [〜#〜] msdn [〜#〜]
なぜならConvert.ToBoolean
は、値がゼロでない場合、 trueを期待します。そうでない場合はfalse。 数値およびTrue
またはFalse
String
値。
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);
}
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
最初の文字をキーオフする非常に寛容なパーサーを次に示します。
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;
}
}