ページ 11

型変換?

Posted: 2007年11月26日(月) 00:12
by -U-
はじめまして。-U-と申します。

1,5,3,

という風に、カンマで区切られた文字を読み込んで、String::Splitを用いていったん配列に格納し、
次にIntに型変換し直して別の配列に格納したいのですが、上手く行きません。
どなたか宜しければ助けていただきたいです。

tempstr: String::Splitでいったん格納させるString配列
rstr: 文字列として「1,5,3,」が入っているString
lastint: 最後に数値として格納するint配列



tempstr = rstr->Split(delimiter);

IEnumerator* Enum = tempstr->GetEnumerator();

int j = 0;

while (Enum->MoveNext()) {

String* s = __try_cast<String*>(Enum->Current);
Debug::WriteLine(s);
lastint[j] = Convert::ToInt16(s);
j++;

}



コンパイルは通りますが、実行すると
System.FormatException: 入力文字列の形式が正しくありません。

というエラーが出てしまいます。
lastint[j] = Convert::ToInt16(s);の部分で引っかかっているようですが、原因が分かりません。

マニュアルも調べてみたのですが、Stringをintにすることは出来るようでした。
なぜintに変換できないのでしょうか?
宜しくお願いします。

Re:型変換?

Posted: 2007年11月26日(月) 00:21
by Blue
とりあえず環境はきちんと明記しましょう。

>lastint: 最後に数値として格納するint配列
ならば
>Convert::ToInt16
ではなくて ToInt32 なのでは?
(int=Int32)

>Debug::WriteLine(s);
でちゃんとした数字になっていますか?

それと
>IEnumerator* Enum = tempstr->GetEnumerator();
>while (Enum->MoveNext()) {
普通にfor文使わないのは何か意味があるのでしょうか?
for (int j = 0; j < tempstr->Count; ++j)
{
    String* s = tempstr[j];
}
# VS2005ならfor eachが使えて便利なんですけどね。

Re:型変換?

Posted: 2007年11月26日(月) 00:34
by Blue
ちなみに
>「1,5,3,」
だと要素数が4の配列になります。
最後の要素は空文字になり、それに対するToInt16メソッドは失敗します。

VS2005で/clr:oldSyntaxで試したコード
int main()
{
	System::String* rstr = S"1,5,3,";
	System::String* tempstr[/url];
	int lastint __gc[/url];

	System::Char delimiter[/url] = {L','};
	tempstr = rstr->Split(delimiter); 

	lastint = __gc new int __gc[tempstr->Count];
	for (int j = 0; j < tempstr->Count; ++j)
	{
		lastint[j] = System::Convert::ToInt32(tempstr[j]);
	}
	
	return 0;
}

Re:型変換?

Posted: 2007年11月26日(月) 00:59
by -U-
申し訳ありませんでした。
環境はMicrosoft Visual Studio C++ 2003.NETのWindowsフォームです。

教えて頂いた通りやってみたのですが、やはり同じエラーが出てしまいました。

System.FormatException: 入力文字列の形式が正しくありません。
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Int32.Parse(String s, NumberStyles style, IFormatProvider provider)
at System.Int32.Parse(String s)
at System.Convert.ToInt32(String value)

エラーの全文です。

直前のDebug::WriteLineなどを見ても、どうやら一番最初に
lastint[j] = System::Convert::ToInt32(tempstr[j]);
がある場所でエラーが起きてしまっているようです。

Re:型変換?

Posted: 2007年11月26日(月) 02:27
by Blue
もう答えは書いたつもりなんですけど。

>>「1,5,3,」
>だと要素数が4の配列になります。
>最後の要素は空文字になり、それに対するToInt16メソッドは失敗します。

空文字列は0にするのか、
それともないものとするのかどちらなんでしょうかね?

後者だと配列数が変わるので、int型配列でもつとめんどくさそうですけど。
(最初に配列数を決めてnewしているから。ArrayListだったらいいんだけど。
# .NET Framework2.0(VS2005)以降のList ジェネリック クラスならもっと簡単。 )

Re:型変換?

Posted: 2007年11月26日(月) 11:14
by -U-
lastintに格納するにあたって、rstrの数値が「1」「5」「3」ではなく
「1,」「5,」「3,」になっていただけでした。

手違いでお手数おかけしてすいません。ありがとうございました!