• ベストアンサー

文字列の比較

初歩的なことかも知れませんが教えてください。 VB6です。 通常テキストボックスの数字を比較する時、string型なので数字に変換して比較する必要があると思います。 が、数字に変換するのを忘れてそのまま比較した所おかしなところがありました。 VBでは自動的に数字として変換してくれるのかと思っていたのですが何故このような事になるのでしょうか? <例> 1. int(100) > int(99)  結果:TRUE 2. cstr(99) cstr(98) 結果:TRUE 3. cstr(100) > cstr(99) 結果:FALSE 1番と2番は納得が出来ますが、3番は何故?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

一文字目から見ているのでは? "100" と "99" の比較 1."1" と "9" を比較(たぶん文字コードで)  →右辺の方が大きい  →比較終了 "99" と "98" の比較 1."9" と "9" を比較  → 同じなので次の文字へ 2."9" と "8" を比較  →左辺の方が大きい  →比較終了 数値では 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21 の順番ですが 文字列では 1, 10, 11, 2, 20, 21, 3, 4, 5, 6, 7, 8, 9 の順番となります。

lasichi
質問者

お礼

なるほど。確かにそんな感じですね。 これって仕様ですか? MSDNとかネットで探したんですがどこにも見つけられなかったんですが。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

数値の比較でテキストボックスの内容が数字に限定されているなら 数値型の変数に格納して比較したほうがいいように思います dim nText1 as Integer, nText2 as Integer nText1 = Text1.Text nText2 = Text2.Text として nText1とnText2を比較すればいいと思います Integerの範囲で収まらないようならば LongやSingleまたはDoubleなどを使いましょう

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.3

こんにちは 横からごめんなさい。#1補足です。 >これって仕様ですか?  文字コードの大小で比較しているからです。VBに限った話しではありません。  国際標準ISOコード(通常半角と呼んでいる)だと次のようになっています(タイプフェースは書体という意味ですが、フォントといった方が判りやすいかも)。 タイプ フェース コード  '0' = &H30  '1' = &H31  '2' = &H32  '3' = &H33  '4' = &H34  '5' = &H35  '6' = &H36  '7' = &H37  '8' = &H38  '9' = &H39 VBのchr$関数で chr$(&H30) とすれば、文字'0'(ゼロ)を返します。

lasichi
質問者

お礼

ありがとうございました。すっきりしました。

  • Sinogi
  • ベストアンサー率27% (72/260)
回答No.2

>3. cstr(100) > cstr(99) 結果:FALSE "100" と"99" の比較 "100"の左1文字目="1" "99" の左1文字目="9" "1">"9" 結果:FALSE

lasichi
質問者

お礼

ありがとうございました。すっきりしました。

関連するQ&A

  • strtol関数で文字列の有無を判定したい

    プログラミング初心者です。 Visal Studio 2010を使用してC++の勉強をしています。 strtol関数を使って、変換不可能な文字列が返ってきたらtrue。何も返ってこなかったらfalse。としたいのですが、ifの()の中身をどう書けばよいのかわかりません。どなたか教えて頂けないでしょうか。 //サンプル int i; char cstr[]="12h34"; char *pc; i = (int)strtol(cstr,&pc,0); if( ??? ){ cout << "if true" << endl; }else{ cout << "if false" << endl; } 以上になります。お読みいただきありがとうございました。 よろしくお願いいたします。

  • オブジェクトの比較と文字列の比較の違い

    今、基本情報技術者の勉強でJavaを勉強しているのですが、持っているテキストの問題で分からないものがありました。 String str1 = "Hello."; String str2 = "Good, Bye."; String str3 = str1; String str4 = str1 + str2; とすると、 (A)str1 == str2; がfalse (B)str1.equals(str3); がtrue というのは分かるのですが、 (C)str4 == "Hello.Good, bye."; がなぜfalseになるのでしょうか? ==はオブジェクトの比較で、equlasは文字列の比較だと書いているのですが、よく違いが分かりません。 また、 上の4つの処理の後に str3 = "test"; という処理を行っているのですが、このときの状況は、 str1はHello.のままで、 str3のみがtestになっている、と理解したのですがそれで合っているのでしょうか?

    • ベストアンサー
    • Java
  • 日本語文字列の比較

    複数行のテキストボックスから日本語の文字を拾い出して 入力された文字と比較しようとしているのですが、 矢印の部分で、エラーが出て上手く処理ができません アドバイスをいただけないでしょうか Dim str As String   For i = 0 To TextBox1.Lines.Length → str = CStr(TextBox1.Lines(i + 1))        ・        ・        ・

  • 文字列の配列の比較

    こんにちは。タイトルどおり簡単な質問なのですが、どうしても確認したいのでお願いします。 とあるメソッドで、2次元配列の中にいくつか大文字のOが入ってるのですが、与えられた配列にOがあればtrueを返し、なければfalseを返します。 public boolean cellAt(int row, int col){ if(space[row][col].equals("O")) return true; else return false; } rowとcolはテストメソッドから値を受け取ります。 これでプログラム自体は動くのですが、WebCatという自動的に採点するものがあるのですが、それによるとエラーがでてしまいます・・・。 どこが違うのかは教えてくれないのですが・・・。 上で間違っているとすれば、文字列の比較くらいしかないんじゃないかと思うのですが、 space[row][col].equals("O") これで比較できますよね? 他のを調べて、if (Arrays.equals(space[row][col], "O"))これを試してもみたのですが、赤線が出てしまって無理でした。 どなたか宜しくお願いします。

  • テキストボックス内の型変換と数字チェックについて

    ●VB6.0を使用しているのですが、テキストボックスにある数字(string型)を数値型にして40-12など普通の計算を行うにはどのように型変換をすればいいのでしょうか? ●また数字に007や03など0で始まる数字を取り除く関数があれば教えていただけますか?

  • 括弧が含まれる文字列の括弧の中身の文字列(VB6)

    括弧()の中身の文字列をそれぞれ配列の文字列変数に設定したいと考えているのですが、Replaceを使えばいいのでしょうか? また、Replaceは置き換える文字の検索の開始場所は設定できると思うのですが、置き換える文字の検索の終了の場所は設定できるのでしょうか? 例えば、(asdf)as(asdfe)as(sf)という文字列のasdf,asdfe,sfをそれぞれ配列を使って文字列変数として表したいのです。 nyuuryoku = Text1.Text For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "(" Then k = k + "と" + CStr(i) j = j + 1 ElseIf Mid(nyuuryoku, i, 1) = ")" Then m = m + "と" + CStr(i) l = l + 1 End If Next i Text17.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目" For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "[" Then kk = kk + "と" + CStr(i) jj = jj + 1 ElseIf Mid(nyuuryoku, i, 1) = "]" Then mm = mm + "と" + CStr(i) ll = ll + 1 End If Next i Text2.Text = "[ は" + CStr(jj) + "個" + kk + "番目、" + "] は" + CStr(ll) + "個" + mm + "番目" Dim kakkohajime(50) As Long Dim kakkoowari(50) As Long Dim kakkonakami(50) As String For i = 1 To CStr(j) kakkohajime(0) = 1 kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(") Next For i = 1 To CStr(j) kakkoowari(0) = 1 kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")") Next このあとにkakkohajime(i)の場所からkakkoowari(i)の場所までの文字列をそれぞれkakkonakami(i)の配列の文字列にいれたいのです。 最後に、kakkonakami(i)をtextに表示したいと思っています。

  • バイナリ文字列の比較について

    テキストをバイナリで読み込んで文字列を比較する際に 下記のロジックだと2バイトずつ読み込んで比較していくのですが 比較したい文字列が"He"だと合致するのですが1バイトずれの "el"だと合致しません。 ストリーム内の任意の文字列を判定したいときはどのように修正すればよいでしょうか? ----sample.txt--- Hello World!! ---------------- byte[] buf = new byte[2]; FileInputStream in = new FileInputStream("sample.txt"); int b; while ((b = in.read(buf)) != -1) { if ("He".equals(new String(buf))) { System.out.println("HelloのHeはOK"); } if ("el".equals(new String(buf))) { System.out.println("HelloのelはNG"); } }

    • ベストアンサー
    • Java
  • 文字列や文字から整数への変換方法について

    文字列(string型)や文字(char型)から整数(int型など)に変換 する時のルールがよく解りません。 たとえば、キーボードから数字を打って、その入力された数字を 数値として整数型の変数に代入したい場合のやり方です。 ちょっとプログラムを作ってみました。 using System; class clmain { private static void Main() { Console.Write("1桁の整数を入れてね "); char ch = char.Parse(Console.ReadLine()); int by1 = (int)ch; int by2 = (int)char.GetNumericValue(ch); Console.WriteLine("by1 = {0}, by2 = {1}, ch = {1}", by1, by2, ch); Console.Write("整数を入れてね "); string st = Console.ReadLine(); /* by = (int)st; コンパイルエラー */ int by3 = int.Parse(st); Console.WriteLine("by3 = {0}, st = {1}", by3, st); } } まず、char型からint型への変換では、  int型変数=(int)char型変数; はコンパイルは通りますけど、実行すると全く違った値が入って しまいます。たとえば char型変数の値が "1" だと、int型変数には 49 が入ります。 int型変数 = (int)char.GetNumericValue(char型変数); と書いてようやく、思い通りの動きをしてくれます。 また、string型からint型への変換では  int型変数=(int)string型変数; はコンパイルエラーになります。 int型変数 = int.Parse(string型変数); とするとコンパイル出来て正しく動きます。 これで質問ですけど、 (1)なぜstring型とchar型で、int型への変換方法が違うのでしょうか? (2)int型変数=(int)char型変数; とすると、上に書いたように、全く 違った(希望しない)値が代入されてしまいます。これは、どういう 動きをしているのでしょうか? また、これはコンパイルエラーに なりませんけど、どういう時にこの書き方をするのでしょうか? 解る方、お願いします。

  • C言語で文字列の比較をしたいです。

    C言語で文字列の比較をしたいです。 現在Visual C++ 2008 Express EditionをつかってWindowsプログラミングの勉強をしているのですが、文字列同士の比較で上手くいかなくなってしまったので、教えてください。 プログラムは、確認ボタンを押すとエディットボックスの内容を取得し、取得された内容が「"abc"」であれば処理を実行するというものです。 //宣言など #include <windows.h> #include <windowsx.h> #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <string.h> static TCHAR chords[512]; //WM_CREATEの部分 hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT") , TEXT("abc") , WS_CHILD | WS_VISIBLE | ES_LEFT |ES_MULTILINE | WS_VSCROLL , 10 , 150 , 300 , 200 , hWnd, (HMENU)4, hInst , NULL); //取得 GetWindowText(hEdit, chords, 512); //判定 if(_tcscmp(chords, TEXT("abc")) == 0)実行する処理; ソースはかなり省略されていますが、エディットボックスとボタンは機能しているようです。 実行すると 「 error C2664: 'wcscmp' : 1 番目の引数を 'TCHAR *[]' から 'const wchar_t *' に変換できません。」 というエラーが出ます。 UnicodeやTCHAR周りの問題のような気がしますが、どうすれば上手くいくのでしょうか?

  • JavaのStringの比較について

    お世話になります。 String string1 = new String("あいうえお"); //(1) String string2 = new String("あいうえお"); //(2) String string3 = "あいうえお"; //(3) String string4 = "あいうえお"; //(4) System.out.println(string1 = = string2); //(5) System.out.println(string3 = = string4); //(6) 実行結果 false true (5)がfalseになるのは分かるのですが、(6)がtrueになるのはなぜでしょう?また、(1)や(2)のようなStringオブジェクトの生成方法と(3)や(4)のようなStringオブジェクトの生成方法の違いは何でしょう? よろしくご教授ください。

    • ベストアンサー
    • Java

専門家に質問してみよう