ハンドル型 の不等号を使用した比較をするには?

解決


くろのすけ  2006-09-16 04:02:04  No: 63023

くろのすけです。
毎度、お世話になってます。

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^型です。


YuO  2006-09-16 04:09:06  No: 63024

文字列の比較は,基本的に等しいか等しくないかだけです。

大きい・小さいの比較は,String::Compare (or String::CompareTo)を使います。


Blue  2006-09-16 04:36:17  No: 63025

文字列を数値として判定するならば、Int32::Parse(もしくはInt32::TryParse)やConvert::ToInt32で数値型にしてから、
数値と判定してください。

if ( Int32::Parse( textMoney->Text ) >= 100 )


恭二  2006-09-16 04:41:32  No: 63026

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#>


Blue  2006-09-16 04:52:32  No: 63027


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 );
    }

の結果はどうなるでしょうか?
そしてなぜそうなるのでしょうか?


Blue  2006-09-16 04:53:41  No: 63028

訂正
>if ( System::String::Compare( x, y ) > 0 )
if ( System::String::Compare( x, y ) >= 0 )

人のこと言えませんでした。。。orz


くろのすけ  2006-09-16 06:07:42  No: 63029

くろのすけです。
皆様、回答本当にありがとうございます。

>文字列の比較は,基本的に等しいか等しくないかだけ

確かにそのとおりでした。(お恥ずかしい....)

実は、私はBlue様の仰っている下記の関数を使用したいのですが、
    Int32::Parse( textMoney->Text )
その際に、Int32::Parseの括弧の文字列が、
数値("0","1","2",etc)であるかないかを判別したいのです。
括弧内の文字列の内容が数値でない場合、
デバッグすると、この関数の箇所で、
-----------------------------------------------------------------
  'System.FormatException'のハンドルされていない例外がmscorlib.dllで発生しました。
  追加情報:入力文字列の形式が正しくありません。
----------------い-------------------------------------------------
というダイアログが出てしまうのです。
そのため、この関数を使用する前に、文字列の中身が
数値なのか?そうでないのか?をチェックしたいです。
しかし、その良い方法が考え付かないのです。

よろしければ、アドバイスいただけますか?


Blue  2006-09-16 06:11:48  No: 63030

でしたら、先にも解答してある、
Int32::TryParseでチェックするか、Convert::ToInt32で例外をキャッチするかしてください。


Blue  2006-09-16 06:19:51  No: 63031

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 ); 
}


くろのすけ  2006-09-16 06:26:12  No: 63032

Blue様、感謝します。

解決できました。


恭二  2006-09-17 07:46:06  No: 63033

ああ、くろのすけさんのコード見ながら書いたもんで、混ざってしまったみたいですorz
お恥ずかしい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加