2009-06-01 57 views
1

私は次のコードでformatexceptionを取得しています。 BooleanConverterを0/1からtrue/falseに変換する方法を知っています。FormatException 0はブール値の有効な値ではありません

bool bVal=true; 
string sVal = "0"; 
Console.WriteLine(TypeDescriptor.GetConverter(bVal).ConvertFrom(sVal)); 

ありがとうございました!

+0

あなたのコードは、罰金です。ブール値は常に "true"または "false"に解決されます。 – code4life

+0

0をboolに変換する理由がわかりません。これはC/C++プログラミングのようです。 true/falseに0と1を使用すると、コードを読みにくくなる可能性があります。 – TheLukeMcCarthy

答えて

1

真実であることを文字通り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を返すの両方)

+2

これはかなり古い投稿ですが、それは受け入れられた答えなので、3値演算子(たとえば 'val == 0?false:true')は完全に不要であり、コードを読みにくくすると言ってもいいと思います。 'val!= 0'だけを使用してください(最初の例も変更の恩恵を受けることができます)。 – lsoliveira

2

2つのケースしかないので、明示的にチェックすることができます。

+0

私は文字列の変換にtypeconvertersを使用するライブラリを使用しています...私はブール値フィールドの0/1を渡す場合、私はこの例外が発生します。私はそれがどのように変換するかを制御することはできません。 – Gentoo

+0

あなたはあなたが支配しているものについてより多くの情報を与えることができますか?文字列が正しく「偽」と「真」であることを確認できますか? –

+1

0と1を内部または文字列に変換します(0と1をintまたは文字列にマップし、Boolに直接マップしないでください)、実行時にBoolに変換する 'get'プロパティを追加しますあなたが必要とする場所でコードに必要な値を返します。 –

3

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; 
} 
+0

私はC言語のように非ゼロの文字列をtrueにマップすることをお勧めします。 –

+1

私はlinqtocsvライブラリを使用しています。私のCSVファイルでは、0と1の列があります。フィールドは、私の説明ではヌル値ブール値(bool?)としてマークされています。したがって、ライブラリが自分のCSVファイルをデータベースに変換すると、このfield.TypeConverter.ConvertFromString(value)が実行されます。ここの値は "0"または "1"で、TypeConverterはBooleanConverterになり、FormatExceptionがスローされます。 お互いのご提案ありがとうございます。私は私の場合にこれを実装できるかどうかはわかりません! – Gentoo

1

私はちょうどブールの特殊なケースを処理するヘルパー関数を構築しました:

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 
1

元のコードで十分でした。文字列の値を「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)); 
0
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(); 
関連する問題