■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#40694-0CIntとVal、CStrとStrkoo2001-03-23(金) 09:24
     #40701-0RE#40694:CIntとVal、CStrとStrこちゃ2001-03-23(金) 09:59
     #40702-0RE#40694:CIntとVal、CStrとStrよねKEN2001-03-23(金) 10:02
     #40712-0RE#40702:CIntとVal、CStrとStrろってんまいあ2001-03-23(金) 11:21
     #40739-0RE#40712:CIntとVal、CStrとStrkoo2001-03-23(金) 16:57
#40694-0
CIntとVal、CStrとStr
文字列でとってきた値を数値に変換するにはCIntとVal関数があると思いますが、
この2つの関数の違いがよく解りません。"1234"→1234に変換したりするだけな
のですが、どちらが一般的なんでしょうか。どっちでもいいと言えばいいんでし
ょうけど。その逆もあるし・・・。ちょっと気になってしまって。
#40701-0
RE#40694:CIntとVal、CStrとStr
> 文字列でとってきた値を数値に変換するにはCIntとVal関数があると思いますが、
> この2つの関数の違いがよく解りません。"1234"→1234に変換したりするだけな
> のですが、どちらが一般的なんでしょうか。どっちでもいいと言えばいいんでし
> ょうけど。その逆もあるし・・・。ちょっと気になってしまって。


CInt関数は引数の文字列をInteger型に変換したものを返します。
当然、引数で渡す文字列は数値として解釈のできるもの(isNumeric関数でTrueを返すもの)
でなければ実行エラーになります。
たとえば、CInt("\1,000") の場合、"\"や","なども数字をあらわす文字として有効とみなされ、
1000を返します。
それとInteger型に変換するので、CInt("24.56")は24という整数(Integer型)を返します。

	同じような関数で
	Double型に変換するCDbl関数、
	Single型に変換するCSng関数、
	Long型に変換するCLng関数、
	String型に変換するCStr関数・・・・などなど
	いわゆる基本データ型に変換する関数が用意されています。


Val関数は引数の文字を数値型に変換します。
(正確には内部が数値型のVariant型)
返ってくる数値型はIntegerになるかLongになるか、SingleなのかDoubleなのかは
Val関数が自動でやっちゃいます。(やな感じです)
あと、引数の文字列の頭から数値だけを取得していき、数値以外の文字があると中止します。
(スペースやタブ、キャリッジリターンなどのいわゆる空白文字は無視される)
たとえば、Val("  123 45abcd678")としたら、左から有効な数字のみを取得して
12345を返します。

	Variant型の内部データ型を知るには TypeName関数を使います。


文字を数値に変換する・・・・と言った時、一般的かどうか分かりませんが
私はCInt関数やCLng関数を使います。
一番にデータ型を特定できるからですが・・・。
(当然、文字列が数値に変換できるか、データ型の許容範囲かどうかはチェックが必要)


こんな感じで良いですか?
詳しくはVBのヘルプを見たり、自分で試して下さい。
#40702-0
RE#40694:CIntとVal、CStrとStr
> 文字列でとってきた値を数値に変換するにはCIntとVal関数があると思いますが、
> この2つの関数の違いがよく解りません。"1234"→1234に変換したりするだけな
> のですが、どちらが一般的なんでしょうか。どっちでもいいと言えばいいんでし
> ょうけど。その逆もあるし・・・。ちょっと気になってしまって。

実際にいろんな値で実験してみるのが一番です。理解も深まりますし。

CIntはIsNumeric関数がTrueを返す値のうちIntegerの範囲内の数値の文字列を引数として
受けて、数値に変換します。

? CInt("1234")
 1234
? CInt("\1,019")
 1019 
? CInt("1E4")
 10000
? CInt("1234A") →型が一致しません
? CInt("123400") →オーバーフロー

などです。他の値もイミディエイトウィンドウでいろいろ試しましょう。

それに対してVal関数は数値として読めるところまで読み後は無視します。
だから、
? Val("1234A")
 1234
のように"1234A"という場合、"1234"までを数値と判断して変換します。

Val関数はCInt関数と違って、\や,は解釈しませんので、
? Val("\1,019")
  0
となります。
小数点も.だけを小数点とみなします。
純粋な数字であることを判断するときにはこちらの方が便利な場合も多いでしょう。
数字と判断できない文字以降は基本的に無視するので、エラーになることがほとんどありません。

例外的に
? Val("12.9%")
? Val("12.9&")
などはエラーになります。

また、16進数表現の文字列も解釈してくれます。
? Val("&HFF")
 255

とまぁ、これらは別々の関数なので、使い分けましょう。
そんな感じです。
#VB4の場合は、Val関数でメモリリークするバグがあったので、避けるようにしていましたが、
#VB5以降は問題ないと思います。

CStr、Strの違いは、正の数、負の数をそれぞれ変換してみて下さい。
そのときに違いがわかります。こちらは今となってはStr関数は使わなくていいでしょう。
#40712-0
RE#40702:CIntとVal、CStrとStr
> ? CInt("1234A") →型が一致しません

ちなみにですね、エラーにならない事もあります。
それは、「コントロールパネル」の「地域のプロパティ」で小数点の記号を "A" としている時です。
そんな事している人はいないと思いますが、こういう事もあるという事で。

その他、桁区切り記号を "B" と設定していると、
? CInt("12B345") もエラーになりません。
キチンと、12345 になります。

そして、小数点の記号を "A"、桁区切り記号を "B" としている時に、
? Format(123456.78,"Standard")
とすると、123B456A78 となり、
n = CDbl("123B456A78") 
とすると、変数 n に 123456.78 が代入されます。
ただし、? CDbl("123B456A78") とすると、123456A78 と表示してしまいますが。

例外はマイナス記号で、例えば "X" と設定しても
? CInt("X123") はエラーになります。
しかし、
? format(-123,"0") とすると、 X123 となります。

その他、Date$,Time$ は「地域のプロパティ」に影響を受けず、
Date,Time,Format 等は「地域のプロパティ」影響を受けて、
IsDate 関数は、「地域のプロパティ」を無視しています。
以前、間違えて時間の区切り記号を空白文字にして、パニックになった事があります。
だって、13時30分25秒が、"13 30 25"になってうのですよ
そして、IsDate関数は、時刻の区切りが ":" 以外は判定してくれないから
時間の区切り記号が ":" 以外だと、
IsDate(Format(Now,"HH:MM:SS")) が False になる事があるのですよ。
#40739-0
RE#40712:CIntとVal、CStrとStr
皆さん有難うございました。参考になりました。
このページと関連する記事:
#28058-0数値型から文字列に変換2002-04-04(木) 23:36
#44954-0FormatNumber関数の使い方について2001-07-13(金) 10:02
#21289-0テキストボックス内に表示させた数値の表示方法2002-06-25(火) 15:56
#695-1ValとCdblについて2002-09-06(金) 03:25
#1554-1IntとCInt?2004-04-05(月) 11:25
#14633-0カレンダーを自分で作るには?2001-02-21(水) 12:52
#14323-0テキストボックスについて2001-02-04(日) 16:25
#45100-0数値変数からDATE型の変換方法2001-07-18(水) 02:33
#8179-0RE#8176:なぜstr$を使うのですか?2000-03-06(月) 10:11
#8528-0ファイルタイプ2000-06-03(土) 12:05
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)