くろのすけです。
毎度、お世話になってます。
Visual C++ 2005 C++/CLIでプログラムを作っています。
下記の①と②をそれぞれビルドしましたが、
①の条件判定(100と等しい)では、エラーがでないのに、
②の条件判定(100以上)だと、エラー(★印)が出ます。
--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
①エラー無し
if ( textMoney->Text == "100" )
{
MessageBox::Show("指定されてた金額ではありません!!");
return;
}
--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
②エラー有り
if ( textMoney->Text >= "100" )
{
MessageBox::Show("指定されてた金額ではありません!!");
return;
}
★エラー内容 → error C2865: '>=' : ハンドル型 の比較が正しくありません
--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Textの値によって条件判定したいのですが、等号による条件判定はできても、不等号による条件判定は不可能なのでしょうか?
お分かりの方、よろしくお願いします。
[※] textName → System::Windows::Forms::TextBox^型です。
Text → System::String^型です。
文字列の比較は,基本的に等しいか等しくないかだけです。
大きい・小さいの比較は,String::Compare (or String::CompareTo)を使います。
文字列を数値として判定するならば、Int32::Parse(もしくはInt32::TryParse)やConvert::ToInt32で数値型にしてから、
数値と判定してください。
if ( Int32::Parse( textMoney->Text ) >= 100 )
MC++はよくわかりませんが、Textが文字列型ならば、
textMoney->Text == "100" は Text に格納されている文字列が "100" と一致するということです。
名前からすると金額のチェックを行いたいようですが、そういう場合は通常数値に変換してから利用します。
(単純に文字列比較を行いたいなら、YuOさんの方法で出来ます)
#C++/CLIはわからないので参考程度にC#のコードですが…
#System.Convert.ToInt32を使って変換
<C#>
void func()
{
if( System.Convert.ToInt32(textMoney->Text, 10) >= 100 )
{
…
}
}
</C#>
↑
C#のコードになっていないようですが。
> textMoney->Text,
ちなみに、数値文字列を文字列のまま比較すると、、、
System::String^ x = L"100";
System::String^ y = L"80";
if ( System::String::Compare( x, y ) > 0 )
{
System::Console::WriteLine( "{0}>={1}", x, y );
}
else
{
System::Console::WriteLine( "{0}<{1}", x, y );
}
の結果はどうなるでしょうか?
そしてなぜそうなるのでしょうか?
訂正
>if ( System::String::Compare( x, y ) > 0 )
if ( System::String::Compare( x, y ) >= 0 )
人のこと言えませんでした。。。orz
くろのすけです。
皆様、回答本当にありがとうございます。
>文字列の比較は,基本的に等しいか等しくないかだけ
確かにそのとおりでした。(お恥ずかしい....)
実は、私はBlue様の仰っている下記の関数を使用したいのですが、
Int32::Parse( textMoney->Text )
その際に、Int32::Parseの括弧の文字列が、
数値("0","1","2",etc)であるかないかを判別したいのです。
括弧内の文字列の内容が数値でない場合、
デバッグすると、この関数の箇所で、
-----------------------------------------------------------------
'System.FormatException'のハンドルされていない例外がmscorlib.dllで発生しました。
追加情報:入力文字列の形式が正しくありません。
----------------い-------------------------------------------------
というダイアログが出てしまうのです。
そのため、この関数を使用する前に、文字列の中身が
数値なのか?そうでないのか?をチェックしたいです。
しかし、その良い方法が考え付かないのです。
よろしければ、アドバイスいただけますか?
でしたら、先にも解答してある、
Int32::TryParseでチェックするか、Convert::ToInt32で例外をキャッチするかしてください。
Sample)
System::String^ x;
int num;
x = System::Console::ReadLine();
if ( int::TryParse( x, num ) )
{
System::Console::WriteLine( L"{0} は {1} 以{2}。", x, 100, ( ( num >= 100 ) ? L"上" : L"下" ) );
}
else
{
System::Console::WriteLine( L"{0} は数値に変換できない。", x );
}
Blue様、感謝します。
解決できました。
ああ、くろのすけさんのコード見ながら書いたもんで、混ざってしまったみたいですorz
お恥ずかしい。
ツイート | ![]() |