2017-03-10 10 views
0

私はCSVリーダーを持っているので、一般的なキャスト方法があります。私が合格した場合しかし、なぜTypeConverterは文化に従わないのですか?

try 
{ 
    TypeConverter converter = TypeDescriptor.GetConverter(type); 
    if (converter != null) 
    { 
     result = converter.ConvertFromString(null, culture, value); 
     return true; 
    } 

    result = type.GetDefault(); 
    return true; 
} 
catch 
{ 
    result = type.GetDefault(); 
    return false; 
} 

タイプ:int

値:"123.024"

文化:de-DE

コンバータは常に失敗し、リターンをそれそれは、私がこれを行います0を正しく処理する代わりに、.を何千ものセパレータ。

誰かがそれを動作させる方法を知っていますか?

+0

完全な方法を共有できますか? – Murad

+0

TypeConverterはプログラマー向けで、Visual Studioの[プロパティ]ウィンドウに電力を供給します。 CSVデータを解析するために使用すると、良い考えではありません。 –

答えて

2

Int32Converterは、内部Int32.Parseを呼び出し、Int32.Parseはそれに渡された文字列内の桁区切りをサポートしていませんので。

より具体的には、以下に記載Int32.Parse形式:

ザSパラメータは、フォームの数が含まれています

[WS] [符号]数字[WS]角括弧内

アイテム([および])はオプションです。次の表 は、各要素を説明しています。要素説明

wsオプションの空白。

記号オプション記号0から の範囲

桁の数字のシーケンス9

ザSパラメータはNumberStyles.Integerスタイルを使用して解釈されます。小数点の桁に加えて、先頭と末尾のスペース と先頭の記号だけが使用できます。 sに含めることができる スタイル要素を明示的に定義するには、 Int32.Parse(String、NumberStyles)メソッドまたは Int32.Parse(String、NumberStyles、IFormatProvider)メソッドを使用します。

sパラメータは、現在のシステムカルチャ用に初期化されたNumberFormatInfoオブジェクトの書式設定情報を使用して解析されます。 詳細については、CurrentInfoを参照してください。他の文化の書式設定情報 を使用して文字列を解析するには、 Int32.Parse(String、NumberStyles、IFormatProvider)メソッドを使用します。

Int32.Parseを直接呼び出す場合は、NumberStyles列挙型を受け入れるオーバーロードを呼び出して、必要なフラグを含む複合値を作成します。 E.G:

Int32.Parse(value, NumberStyles.Integer | NumberStyles.AllowThousands); 

しかし、あなたはintのための特別なケースが必要になりますいずれかのようGetConverter()Int32Converterどちらも、Int32.ParseのデフォルトNumberStylesをオーバーライドする任意の手段を持っているか、あなたは文字列が、この関数に渡されたことを確認する必要があります千単位の区切り文字は含まれていません。

+0

ありがとうございます。だから私は 'TypeConverter'を落とし、代わりに手作業でparseメソッドを呼び出す必要があります。 – Tim

+0

@Timこれはおそらく最高のものです。特定のタイプごとにコードを記述するのは確かに面倒ですが、少なくともこのようにして、必要なカスタム処理を追加するのは簡単です。 –

関連する問題