VB6.0で作成しています。
数値データをString型で保存し、その後大小チェックを行っているのですが。
「09」と「1」等を比較する時「1」>「09」という結果が返ってきました。
データの型はString型のままで比較し、かつ「09」<「1」という結果を得られるようにしたいのですが、何か良い方法は無いでしょうか。
最初に思いつくのはListBoxを使ったソートです。
ヒントは、
・文字列の左を有効桁まで0で埋める
・ItemDataプロパティを使う
・構造体(それかクラスのインスタンス)、の配列を使う
辺りでしょうかね…?
>データの型はString型のままで比較し
何か意味あるの?
>「09」と「1」等を比較する時「1」>「09」という結果が返ってきました。
で、
>「09」<「1」という結果を得られるようにしたいのですが
ってコトは・・・・できてるジャン。。
比較するときだけValを使ってみるとか。
>ってコトは・・・・できてるジャン。。
#私もそう思いました(笑
申し訳ありません。間違いです。
> かつ「09」<「1」という結果を得られるようにしたいのですが
ではなく、「09」>「1」の間違いです。
ご教授のほどよろしくお願い致します。
Dim s1 As String
Dim s2 As String
s1 = "09"
s2 = "1"
If Val(s1) > Val(s2) Then
Debug.Print "09 > 1"
End If
こうゆうことですか?
>If Val(s1) > Val(s2) Then
と思ったんだけど
>データの型はString型のままで比較し
ということなので、
String型のまま比較することに何か意味あるの?
と思ったんですが。
"1"<"09"
としたいんだったら
"01"<"09"
としてから比較すればいいだけのような。
>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さん。
なんか私のレスだけ安直に見えてきて鬱だな…(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どっちでしょ?
>ガッさん
質問者さんはソートなんて言ってないような。(^^;
厳密に言うと質問者さんは「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」という結果を得られるようにしたいのですが
に応えられる
みなさん、ありがとうございます。
今のところは数値のみ入力ですがこれが英文字が追加されるかもしれないので
それに備えて文字列というのは条件なんです。
Val変換もしくはZERO編集でやってみます。
ありがとうございました。
なんかおかしな仕様ですね。
"09"と"hoge"はどっちが大きいことになるんだろう。。。
文字というのは16進に使用される"A"〜"F"のことかな?
であればValで問題なくできるんだけど。
"09"の方が大きいと思います。
文字はValを通すと、0になりますから、
16進数の"1A"などでも、、文字と見なされて、0になります。
val()だと確かにそうなるけど、
「長さを無視するために基底の文字で埋めた文字列」の比較なら、
・Xは基底の文字
・"09">?"hoge"⇒X+X+"09">?"hoge"
となるから、Xによっては微妙なんだよなぁ…
※いずれにせよ、これでは話にならない。
俺もちょっとつっこむ。
>文字はValを通すと、0になりますから、
文字列の「0」〜「9」は文字列だけど、「0」にはならないので、
もうちょっと言い回しを変えた方が良いかも・・・
>id_rsa+さん
すみません、混乱するようなことを書いてしまいました。
文字の「0」〜「9」はValを通すと、数字の0〜9として、処理されますが、
文字の「hoge」はValを通すと、数字の判定が出来ないため、
Val関数がエラーを出す、次にエラーのため、戻り値、0を戻す。
よって、16進数の「1A」をまとめて、Val関数に送ると、
hogeと同様にエラーを出し、0を返す。
ということです。
そのまえに、ガッさんの言うとおり、
「0〜9」と「hoge」をどう考えても、if文で判断する方はいませんが・・・・・
まず根本的に「英文字が追加される」っていうシステムの仕様が意味不明な訳ですが
何を比較させたいのか・・・
ツイート | ![]() |