[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/08/07(Mon) 11:24
投稿者名:やま
Eメール:
URL :
タイトル:
VBでの文字列の扱いについて
VB6Sp4で文字列"0D00"、"0E00"を扱っていたら数値の0として認識されてしまうのですが
回避方法などあるのでしょうか?



msgbox format(cstr("0A00","0000"))  →  "0A00"
msgbox format(cstr("0B00","0000"))  →  "0B00"
msgbox format(cstr("0C00","0000"))  →  "0C00"
  msgbox format(cstr("0D00","0000"))  →  "0000"
  msgbox format(cstr("0E00","0000"))  →  "0000"
msgbox format(cstr("0F00","0000"))  →  "0F00"

if cstr("0E00") = 0 then    →    true

文字列として扱われないで指数として扱われているようなのです
ちなみにVB.NET2003、VB2005でも同じ現象がでていました

投稿時間:2006/08/07(Mon) 11:58
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re: VBでの文字列の扱いについて
Format関数を使う理由は何でしょうか?
そのまま表示すれば問題ないと思いますが…
msgbox "0A00"
msgbox "0B00"
msgbox "0C00"
msgbox "0D00"
msgbox "0E00"
msgbox "0F00"

投稿時間:2006/08/07(Mon) 12:21
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: VBでの文字列の扱いについて
> if cstr("0E00") = 0 then    →    true
>
> 文字列として扱われないで指数として扱われているようなのです
> ちなみにVB.NET2003、VB2005でも同じ現象がでていました

文字列と数値と比較しているので、数値として判断しているのです。
(型あわせをしないと、VBの方で勝手に型合せをやってしまうので)

if cstr("0E00") = "0" then 又は If CStr("0E00") = CStr(0) Then で比較しないと

    Debug.Print "123" + 20   '143
    Debug.Print "123" + "20"    '12320

    Debug.Print 123 + "123"     '246
    Debug.Print 123 & "123"     '123123

このように暗黙の変換が行われるのです。

投稿時間:2006/08/07(Mon) 13:20
投稿者名:やま
Eメール:
URL :
タイトル:
Re: VBでの文字列の扱いについて
すみません、えーと
そもそもなぜ文字列"0D00"や"0E00"(それもCStrをしても)が0として認識してしまうのかなと思いまして


質問の原因となったのが、
変数Aに英数混在もしくは数字のみの3〜4桁の文字列が入ってきます(英数混在時は必ず4桁)
"001"、"900"、"0E00"などです、この変数を4桁の文字列にFormat(3桁の場合頭に0を付与する)
してデータベースのキー情報と比較してデータを取得するロジックを組んでいたのです。
文字列の長さを測って3桁だったら0を付与するってすれば良かったのですが、横着してFormat関数
を使用していたら"0E00"が"0000"と認識されてしまいデータベースから情報を取得出来ずに
エラーとなっていました

投稿時間:2006/08/07(Mon) 13:28
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^2: VBでの文字列の扱いについて
4桁に統一するなら
MsgBox Right$("0000" & A, 4)
で良いです。

変数Aが必ず3〜4桁なら
MsgBox Right$("0" & A, 4)
でもOK

投稿時間:2006/08/07(Mon) 15:02
投稿者名:
Eメール:
URL :
タイトル:
Re^2: VBでの文字列の扱いについて
これはFormat$()関数のヘルプを引いてみた上での質問ですか?

投稿時間:2006/08/07(Mon) 15:53
投稿者名:ふく
Eメール:
URL :
タイトル:
Re^2: VBでの文字列の扱いについて
> すみません、えーと
> そもそもなぜ文字列"0D00"や"0E00"(それもCStrをしても)が0として認識してしまうのかなと思いまして
>

CStrした後に、数字と比較しているからでは?
花ちゃんさんの解答のとおり"0"と0のちがいを考えたらよいのでは?

16進を扱っているのだからVBに”16進だよ”と教えてあげないと

"0900"は 900じゃ無く 0900 ですよね。

投稿時間:2006/08/07(Mon) 16:10
投稿者名:もげ
Eメール:
URL :
タイトル:
Re^2: VBでの文字列の扱いについて
> そもそもなぜ文字列"0D00"や"0E00"(それもCStrをしても)が0として認識してしまうのかなと思いまして

Eは指数表現、nDmはn × 10 × mを表します。
?10D1
100
?10D2
1000
?10D3
10000
?100D1  
1000


花ちゃん殿の、
>>> if cstr("0E00") = 0 then    →    true
>文字列と数値と比較しているので、数値として判断しているのです。
>(型あわせをしないと、VBの方で勝手に型合せをやってしまうので)

が答えです。

問題の本質は、数値と文字列の暗黙の変換であり、Format関数ではないと思いますよ。

投稿時間:2006/08/07(Mon) 17:57
投稿者名:やま
Eメール:
URL :
タイトル:
Re^2: VBでの文字列の扱いについて
みなさん、いろいろとご教授ありがとうございました。