質問
次の変数があります:
string str1 = "1";
string str2 = "asd";
string str3 = "3.5";
string str4 = "a";
今、各文字列のデータ型、つまり引用符が削除された場合に変換できるデータ型を見つける必要があります。各変数の変換先を以下に示します。
str1-整数
str2-文字列
str3-double
str4-文字
注:文字列に単一の文字が含まれる場合は、文字にする必要がありますが、文字列には単一の文字を含めることができますが、制限しています。
FYI:これらの値は、手動で値を入力したDataGridから取得されます。だから、すべてが文字列になっています。 これを行う方法はありますか?
解決
メタデータを使用(可能な場合)
データ型が何であるかを推測する必要があるのは、良い考えではありません。
2つのこと
1データの送信元はどこですか?
データベースの場合、文字列であると確信していますか? データベースの場合、フィールドのデータ型が何かを示すメタデータが返されるはずです。
Xmlファイルの場合、型を提供するスキーマが定義されていますか?
2推測を続ける必要がある場合。
文字列はたまたま数字である可能性がありますが、文字列として表現するのが最適な電話番号、銀行口座番号など、完全に有効な文字列であることに注意してください。 また、これらの数値には多くの桁が含まれている可能性があり、それらを倍精度に変換すると、一部の桁が浮動小数点の不正確に失われる可能性があります(14桁または15桁までは問題ありません)
私は間違いなくこれを入力するのに時間をかけたので、これを行う方法を教えてくれる答えがたくさんあります(つまり、最初にintを解析し、次にdouble、charの長さをテストし、そうでない場合は文字列など)、しかし、私があなただったら、私はそれをしないようにして、あなたが得ることができる方法があるかどうかを確認するか、それをタイプするかを伝えるいくつかのメタデータを渡します IS そして、タイプするだけでなく、可能性がある
他のヒント
もちろん、これを行う明確な方法はありませんが、優先度順にチェックしたいデータ型のリストを作成する場合、このようなことがうまくいくかもしれません。
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;
}
各文字列でこの関数を呼び出すだけで、適切なタイプのオブジェクトが返されます。単純な型チェックにより、文字列がどのように解析されたかがわかります。
各タイプの TryParse
メソッドを使用します。
これを行う方法は組み込まれていません。精度を上げて数値型でTryParseを試すことはできますが、正しいことを保証するものではありません。
手動で処理するのと同じように処理することをお勧めします。つまり、小数点以下の桁はありますか?いいえ-整数です。どれくらい大きい?負の値ですか?
これらの各項目のデータ型は文字列です。それらを異なるタイプに解析したい場合は、Int32.TryParse、Double.TryParseなどを使用できます。または、正規表現を使用できます。
bool isInt = new Regex(@"^\d+<*>quot;).IsMatch(str);
bool isDouble = !(isInt) && new Regex(@"^\d+\.\d+<*>quot;).IsMatch(str);
bool isChar = !(isInt || isDouble) && new Regex(@"^.<*>quot;).IsMatch(str);
bool isString = !(isInt || isDouble || isChar);