文字の大小チェックを行うには

解決


mkt  2005-07-26 20:22:41  No: 123723

VB6.0で作成しています。
数値データをString型で保存し、その後大小チェックを行っているのですが。
「09」と「1」等を比較する時「1」>「09」という結果が返ってきました。
データの型はString型のままで比較し、かつ「09」<「1」という結果を得られるようにしたいのですが、何か良い方法は無いでしょうか。


ガッ  2005-07-26 20:36:53  No: 123724

最初に思いつくのはListBoxを使ったソートです。
ヒントは、
・文字列の左を有効桁まで0で埋める
・ItemDataプロパティを使う
・構造体(それかクラスのインスタンス)、の配列を使う
辺りでしょうかね…?


030  2005-07-26 21:09:29  No: 123725

>データの型はString型のままで比較し
何か意味あるの?


id_rsa+  2005-07-26 21:41:21  No: 123726

>「09」と「1」等を比較する時「1」>「09」という結果が返ってきました。
で、
>「09」<「1」という結果を得られるようにしたいのですが
ってコトは・・・・できてるジャン。。


KG  2005-07-26 21:56:27  No: 123727

比較するときだけValを使ってみるとか。

>ってコトは・・・・できてるジャン。。
#私もそう思いました(笑


mkt  2005-07-26 23:39:04  No: 123728

申し訳ありません。間違いです。
> かつ「09」<「1」という結果を得られるようにしたいのですが

ではなく、「09」>「1」の間違いです。
ご教授のほどよろしくお願い致します。


id_rsa+  2005-07-26 23:59:55  No: 123729

Dim s1 As String
Dim s2 As String

 s1 = "09"
 s2 = "1"

 If Val(s1) > Val(s2) Then
  Debug.Print "09 > 1"
 End If
こうゆうことですか?


030  2005-07-27 00:30:34  No: 123730

>If Val(s1) > Val(s2) Then
と思ったんだけど
>データの型はString型のままで比較し
ということなので、
String型のまま比較することに何か意味あるの?
と思ったんですが。

"1"<"09"
としたいんだったら
"01"<"09"
としてから比較すればいいだけのような。


id_rsa+  2005-07-27 00:49:28  No: 123731

>String型のまま比較することに何か意味あるの?

憶測ですが・・・
元のデータが、数値に変換されてしまうと支障があるって事じゃないカナ??

Dim s1 As Long
Dim s2 As Long

 s1 = Val("09")
 s2 = Val("1")

 If s1 > s2 Then
  Debug.Print s1 & " > " & s2  'ここで「"09 > 1"」→「"9 > 1"」になる
 End If
みたいな・・・・
どうでしょう?mktさん。


ガッ  2005-07-27 00:51:32  No: 123732

なんか私のレスだけ安直に見えてきて鬱だな…(orz

さて、元の投稿の
> データの型はString型のままで比較し
というくだりが気になりますね…
・元のデータString():X以外のデータを作らずに済む方法
・元のデータXを書き換えないで済む方法
という風にも捉えられますが…
この場合、専用の比較方法を用いたソーティングが必要になりますので、
結構手間が掛かるかもしれませんね。
→件数が少ないなら別に気にする必要はないと思いますが。

※このソート法は最初に長さを無視して比較しますので、
  先ず"09"と"9"は等位になりますが、
  次に長さを考慮に入れているのかが不明なので、
  "09"と"9"の順位が不明になるソートですよね。
  →順序関係">"の定義が、
    >:(String,String)→String
    a,b∈String
    1  a">"b:="aの値がbより大きい"
    2  a">"b:="aの値がbより大きい"∧"aの文字長がbより長い"
    この1、2どっちでしょ?


ねろ  2005-07-27 02:22:36  No: 123733

>ガッさん
質問者さんはソートなんて言ってないような。(^^;

厳密に言うと質問者さんは「09」>「1」と言う結果を返せと言っているだけで、
比較の法則に関しては何一つ示していないのだが。。

たとえば、
Private Function Compare(ByVal s1 As String, s2 As String) As Boolean
    If Val(s1) >= Val(s2) Then
        Compare = True
    Else
        Compare = False
    End If
End Function
たとえばこんな関数を作れば、
>データの型はString型のままで比較し、かつ「09」>「1」という結果を得られるようにしたいのですが
に応えられる


mkt  2005-07-27 03:06:00  No: 123734

みなさん、ありがとうございます。
今のところは数値のみ入力ですがこれが英文字が追加されるかもしれないので
それに備えて文字列というのは条件なんです。
Val変換もしくはZERO編集でやってみます。

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


030  2005-07-27 04:01:45  No: 123735

なんかおかしな仕様ですね。
"09"と"hoge"はどっちが大きいことになるんだろう。。。

文字というのは16進に使用される"A"〜"F"のことかな?
であればValで問題なくできるんだけど。


マグ  2005-07-27 17:28:33  No: 123736

"09"の方が大きいと思います。
文字はValを通すと、0になりますから、
16進数の"1A"などでも、、文字と見なされて、0になります。


ガッ  2005-07-27 17:54:15  No: 123737

val()だと確かにそうなるけど、
「長さを無視するために基底の文字で埋めた文字列」の比較なら、
・Xは基底の文字
・"09">?"hoge"⇒X+X+"09">?"hoge"
となるから、Xによっては微妙なんだよなぁ…

※いずれにせよ、これでは話にならない。


id_rsa+  2005-07-27 17:58:06  No: 123738

俺もちょっとつっこむ。
>文字はValを通すと、0になりますから、
文字列の「0」〜「9」は文字列だけど、「0」にはならないので、
もうちょっと言い回しを変えた方が良いかも・・・


マグ  2005-07-27 23:05:06  No: 123739

>id_rsa+さん
すみません、混乱するようなことを書いてしまいました。
文字の「0」〜「9」はValを通すと、数字の0〜9として、処理されますが、
文字の「hoge」はValを通すと、数字の判定が出来ないため、
Val関数がエラーを出す、次にエラーのため、戻り値、0を戻す。
よって、16進数の「1A」をまとめて、Val関数に送ると、
hogeと同様にエラーを出し、0を返す。
ということです。

そのまえに、ガッさんの言うとおり、
「0〜9」と「hoge」をどう考えても、if文で判断する方はいませんが・・・・・


通ってみた  2005-07-28 04:15:38  No: 123740

まず根本的に「英文字が追加される」っていうシステムの仕様が意味不明な訳ですが
何を比較させたいのか・・・


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

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






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