私は次のコードでformatexceptionを取得しています。 BooleanConverterを0/1からtrue/falseに変換する方法を知っています。FormatException 0はブール値の有効な値ではありません
bool bVal=true;
string sVal = "0";
Console.WriteLine(TypeDescriptor.GetConverter(bVal).ConvertFrom(sVal));
ありがとうございました!
私は次のコードでformatexceptionを取得しています。 BooleanConverterを0/1からtrue/falseに変換する方法を知っています。FormatException 0はブール値の有効な値ではありません
bool bVal=true;
string sVal = "0";
Console.WriteLine(TypeDescriptor.GetConverter(bVal).ConvertFrom(sVal));
ありがとうございました!
真実であることを文字通り0ではないすべてのものを検討します以下を使用することができますしてみてくださいInt32.Parseを使用し、代わりにInt32.TryParseを使用します。変換が失敗した場合はtrueまたはfalseを返します。これは、入力した値が値であるかどうかを確認することがすべて実行されている場合は、より効果的であることを意味します。例:
public static bool ConvertToBool(string value)
{
int val = 0;
return (int.TryParse(value, out val) && val == 0) ? false : true;
}
私は、三項演算子で船外に行く傾向があります(X、Y:?z)は、ので、ここで少し読みやすいバージョンです:
public static bool ConvertToBool(string value)
{
int val = 0;
if (int.TryParse(value, out val))
{
return val == 0 ? false : true;
}
return false;
}
は(私はそれらをテスト。。 "1" "0" がfalseを返し、trueを返すの両方)
これはかなり古い投稿ですが、それは受け入れられた答えなので、3値演算子(たとえば 'val == 0?false:true')は完全に不要であり、コードを読みにくくすると言ってもいいと思います。 'val!= 0'だけを使用してください(最初の例も変更の恩恵を受けることができます)。 – lsoliveira
2つのケースしかないので、明示的にチェックすることができます。
私は文字列の変換にtypeconvertersを使用するライブラリを使用しています...私はブール値フィールドの0/1を渡す場合、私はこの例外が発生します。私はそれがどのように変換するかを制御することはできません。 – Gentoo
あなたはあなたが支配しているものについてより多くの情報を与えることができますか?文字列が正しく「偽」と「真」であることを確認できますか? –
0と1を内部または文字列に変換します(0と1をintまたは文字列にマップし、Boolに直接マップしないでください)、実行時にBoolに変換する 'get'プロパティを追加しますあなたが必要とする場所でコードに必要な値を返します。 –
次
public static bool ConvertToBasedOnIntValue(string value) {
// error checking omitted for brevity
var i = Int32.Parse(value);
return value == 0 ? false : true;
}
それとも、例外をスローしませんが、それはあなたの場合は
public static bool ConvertToBasedOnIntValue(string value) {
if (0 == StringComparer.CompareOrdinal(value, "0")) {
return false;
}
return true;
}
私はC言語のように非ゼロの文字列をtrueにマップすることをお勧めします。 –
私はlinqtocsvライブラリを使用しています。私のCSVファイルでは、0と1の列があります。フィールドは、私の説明ではヌル値ブール値(bool?)としてマークされています。したがって、ライブラリが自分のCSVファイルをデータベースに変換すると、このfield.TypeConverter.ConvertFromString(value)が実行されます。ここの値は "0"または "1"で、TypeConverterはBooleanConverterになり、FormatExceptionがスローされます。 お互いのご提案ありがとうございます。私は私の場合にこれを実装できるかどうかはわかりません! – Gentoo
私はちょうどブールの特殊なケースを処理するヘルパー関数を構築しました:
Private Shared Function StringConverter(ByVal colValue As String, ByVal propertyType As Type) As Object
Dim returnValue As Object
'Convert the string value to the correct type
Select Case propertyType
Case GetType(Boolean)
'Booleans need to be coded separately because by default only "True" and "False" will map to a Boolean
'value. SQL Server will export XML with Booleans set to "0" and "1". We want to handle these without
'changing the xml.
Select Case colValue
Case "0"
returnValue = False
Case "1"
returnValue = True
Case "False"
returnValue = False
Case "True"
returnValue = True
Case Else
Throw New ArgumentException("Value of '" & colValue & "' cannot be converted to type Boolean.")
End Select
Case Else
'Let .Net Framework handle the conversion for us
returnValue = TypeDescriptor.GetConverter(propertyType).ConvertFromString(colValue)
End Select
Return returnValue
End Function
元のコードで十分でした。文字列の値を「0」と「1」に設定することはできません。あなたのコードでは、TypeConverter.ConvertFromは()最終的にだからあなたのコードに以下の変更を行い、あなたが良いことがありBoolean.TryParse()、次のようになりますそのためのコード(感謝リフレクター!)
public static bool TryParse(string value, out bool result)
{
result = false;
if (value != null)
{
if ("True".Equals(value, StringComparison.OrdinalIgnoreCase))
{
result = true;
return true;
}
if ("False".Equals(value, StringComparison.OrdinalIgnoreCase))
{
result = false;
return true;
}
if (m_trimmableChars == null)
{
char[] destinationArray = new char[string.WhitespaceChars.Length + 1];
Array.Copy(string.WhitespaceChars, destinationArray, string.WhitespaceChars.Length);
destinationArray[destinationArray.Length - 1] = '\0';
m_trimmableChars = destinationArray;
}
value = value.Trim(m_trimmableChars);
if ("True".Equals(value, StringComparison.OrdinalIgnoreCase))
{
result = true;
return true;
}
if ("False".Equals(value, StringComparison.OrdinalIgnoreCase))
{
result = false;
return true;
}
}
return false;
}
を起動します:文字列値が変換できない以外
bool bVal = true;
string sVal = "false";
Console.WriteLine(TypeDescriptor.GetConverter(bVal).ConvertFrom(sVal));
string _sOne = "1";
string _sTrue = "TrUe";
bool _bRandom = !Convert.ToBoolean(__sTrue);
string _sResult = Convert.ToBoolean(_sOne);
string _sResultB = Convert.ToBoolean(_sTrue);
string _sResultC = _bRandom.ToString();
あなたのコードは、罰金です。ブール値は常に "true"または "false"に解決されます。 – code4life
0をboolに変換する理由がわかりません。これはC/C++プログラミングのようです。 true/falseに0と1を使用すると、コードを読みにくくなる可能性があります。 – TheLukeMcCarthy