2009-03-03 13 views
1

を見つける:C#の疑い、私は次の変数を持つデータ型

string str1 = "1"; 
string str2 = "asd"; 
string str3 = "3.5"; 
string str4 = "a"; 

今、私は、すなわち、引用符が削除された場合、それを変換することができますするデータ型各列のデータ型を見つける必要があります。ここで私はに変換するために、各変数を希望するものである:

STR1 - 整数
str2の - 文字列
STR3 - ダブル
STR4は -

注意をchar型:文字列は単一の文字を持っている場合それは文字列でなければなりませんが、文字列には1文字しか使用できません。

FYI:これらの値は、手動で値を入力したDataGridから取得されます。だから、すべてが文字列になっています。 これを行う方法はありますか?

+0

たいと思い、それはかもしれないものを入力あなたのコードが何をしようとしているのかを知るためには、このようなカスタム解析を実行すると、decimal、string、datetime、およびboolという4つのデータ型が一般になくなります。 – Juliet

答えて

7

使用したメタデータ、あなたが

できれば

データ型が何であるかを推測しなければならないというのは良い考えではありません。

2つのもの

1データはどこから来ていますか?

データベースの場合は、文字列であることを確認してください。 データベースの場合は、フィールドのデータ型を示すメタデータが返されます。

Xmlファイルの場合は、型を指定するスキーマが定義されていますか?

2推測を続ける必要がある場合。

文字列は数字になる可能性があることに注意してください。完全に有効な文字列、たとえば電話番号、銀行口座番号などは文字列として最適です。 また、これらの数値には2桁に変換すると浮動小数点数が不正確になる可能性があります(最大14桁または15桁まで可)

今のところ私は確信しています - 私はあなたがこれを入力する時間を取った - これを行う方法を教えてくれる多くの答えがあります(例えば、tryparse intを最初に、次にdoubleをテストし、次にcharをテストします。そうでなければ文字列などです)それをしないにしてみてください、とあなたが得ることができるどのような方法がありますかどうかを確認、または ISはなく、それを入力し何を教えてくれるいくつかのメタデータを渡すdはちょうど私が

+0

+1推測のデータ型は、通常、異なるレベルに何か問題があることを意味します。 –

+0

+1あなたが本当に本当に本当に必要な場合を除き、タイプを推測しようとしないでください。 – Coincoin

+0

FYI:これらの値は、手動で値を入力したDataGridから取得されます。だから、すべてが文字列になっています。 – SyncMaster

3

各タイプのTryParseメソッドを使用します。

+0

その場合、 "1" = Decimal、Int16、Int32、Int64、Double ... – cjk

+0

ck、問題がありますか? :) –

+0

@ck:試行の優先順位をつけるだけです。狭い(int)を開始し、より広範なタイプ(double)に向かって作業してください。 –

3

これを行う方法が組み込まれていないため、精度の向上した数値型に対してTryParseを試行できますが、正しいとは限りません。

あなたのベスト・ベットは、手作業のように処理することです。つまり、小数点以下の桁はありますか?いいえ - その整数。どれくらい大きい?それは否定的ですか?

8

確かにこれを行う方法はありませんが、優先順位で確認したいデータタイプのリストを作成すると、このようなことができます。

object ParseString(string str) 
{ 
    int intValue; 
    double doubleValue; 
    char charValue; 
    bool boolValue; 

    // Place checks higher if if-else statement to give higher priority to type. 
    if (int.TryParse(str, out intValue)) 
     return intValue; 
    else if (double.TryParse(str, out doubleValue)) 
     return doubleValue; 
    else if (char.TryParse(str, out charValue)) 
     return charValue; 
    else if (bool.TryParse(str, out boolValue)) 
     return boolValue; 

    return null; 
} 

各文字列でこの関数を呼び出すだけで、適切な型のオブジェクトが返されます。シンプルな型チェックによって、文字列がどのように解析されたかがわかります。

3

これらの各項目のデータ型はstringです。あなたはさまざまなタイプにそれらを解析しようとする場合、あなたはなどInt32.TryParse、Double.TryParseを使用するか、正規表現を使用することができます。

bool isInt = new Regex(@"^\d+$").IsMatch(str); 
bool isDouble = !(isInt) && new Regex(@"^\d+\.\d+$").IsMatch(str); 
bool isChar = !(isInt || isDouble) && new Regex(@"^.$").IsMatch(str); 
bool isString = !(isInt || isDouble || isChar); 
+0

isCharは新しい正規表現(@ "^。$")でなければなりません。 – configurator

+0

良い点ですが、以前の試合が失敗したかどうかを確認していませんでした。また、私はIsMatchを呼んでいませんでした;) –

+0

TryParseメソッドは方法です。あなたは本当にこの種のものについてRegExを望んでいません(スピードの問題を無視しても)。 – Noldorin

関連する問題