目次
文字列を数値に変換します。戻り値の型はDouble(倍精度浮動小数点値)。Doubleの範囲外の数値だとINFもしくは-INFが返ります。INFとはINFinity(無限大、∞)のことです。
- 構文
- Double = VAL( 文字列, エラー値 )
- 引数
- 文字列 (String)必須
- 数値に変える文字列
- エラー値 (Integer = ERR_VALUE)省略可
- 数値に変換できない場合に返す値
- 戻り値
- 数値
数値変換できない場合はエラー値を、デフォルトではERR_VALUE(-999999)を返す
使い方
文字列形式の123を数値に変換します。
PRINT VAL("123")
- 結果
123
数値を指定した場合、そのままの値を返します。
PRINT VAL(123)
- 結果
123
カンマ区切りの値はカンマが外されます。桁区切りの位置が正しくなくてもエラーは発生しません。
PRINT VAL("12,345")
PRINT VAL("123,45")
- 結果
12345 12345
全角の値は半角の数値に変換されます。
PRINT VAL("1234")
PRINT VAL("123,4")
- 結果
1234 1234
先頭や小数点以下末尾のゼロ埋めは外されます。
PRINT VAL("00123")
PRINT VAL("123.45000")
- 結果
123 123.45
漢数字はエラーを返します。
PRINT VAL("百二十三")
PRINT VAL("壱百萬円")
- 結果
-999999 -999999
1,000,000,000,000,000(1E15)以上の値、または0.0001(1E-4)未満の値であれば指数表記、そうでなければ数値で返します。指数表記の場合、仮数部は「\(1<=仮数部<10\)」の範囲になります。
PRINT VAL("1E5")
PRINT VAL("1.8E20")
PRINT VAL("123E25")
PRINT VAL("5.2E-4")
PRINT VAL("3.4E-10")
- 結果
100000 1.8E20 1.23E27 0.00052 3.4E-10
VAL関数では分数の計算はされません。分数を計算するにはEVAL関数を使います。
PRINT VAL("12/25")
PRINT EVAL("12/25")
- 結果
-999999 0.48
数値でない場合はERR_VALUEを返すので、数値に変換できるか否かで条件分岐することができます。
IFB VAL("abcde") <> ERR_VALUE THEN
PRINT "数値に変換しました"
ELSE
PRINT "数値に変換できませんでした"
ENDIF
- 結果
数値に変換できませんでした
文字列か数値か判定
文字列か数値を判定するには+(演算子)もしくはVARTYPE関数を使います。
+は、演算子の両側が数値の場合は算術演算子、そうでない場合は連結演算子として機能します。つまり加算されるか結合されるかで数値かどうかを判断することができます。
aは文字列なので結合されて1234が返り、bは数値なので加算されて127が返ります。
DIM a = "123"
PRINT a + 4
DIM b = 123
PRINT b + 4
- 結果
1234 127
VARTYPE関数は引数の値が文字列であれば258、数値ならば5を返します。
DIM a = "123"
PRINT VARTYPE(a)
DIM b = 123
PRINT VARTYPE(b)
- 結果
258 5
VAL関数を使うと文字列・数値に関係なく、計算に使える数値として扱えるようになります。外部ファイルから読み込んだ文字列を計算に使う場合などに役立ちます。
PRINT VAL("123") + 4
PRINT VAL(123) + 4
- 結果
127 127
数値から文字列に変換
VAL関数とは反対に数値から文字列に変換する場合は、VARTYPE関数で文字列型に変換するか空文字と結合させることで型変換を行います。
DIM n = 12
n = VARTYPE(n, VAR_USTR)
PRINT n
DIM n = 12
n = "" + n
PRINT n
指数表記
UWSCでは非常に大きい値や小さい値を指数表記(Exponential Notation)で表すことができます。
1,000,000,000,000,000(1E15)以上の値、または0.0001(1E-4)未満の値は指数表記で表されます。
\[(仮数部)E(指数部)\] \[(仮数部)E(指数部) = (仮数部) \times 10 ^{(指数部)}\] \[1.0E+n = 1.0 \times 10^{n}\] \[1.0E-n = 1.0 \times 10^{-n} = 1.0 \times \frac{1}{10^{n}}\]例えばアボガドロ定数はEを使った指数表記では以下のようになります。
\[6.02214076 \times 10^{23} = 6.02214076E+23\]指数がプラスの場合E+の+は省略可能です。
\[6.02214076E+23 = 6.02214076E23\]電子量は以下のようになります。
\[1.602176634 \times 10^{-19} = 1.602176634E-19\]UWSCではこのように指数表記で表された値もVAL関数の引数に文字列型で指定することで、計算に使える数値にすることができます。
PRINT VAL("6.02214076E+23") // アボガドロ定数
PRINT VAL("6.02214076E23") // アボガドロ定数
PRINT VAL("1.602176634E-19") // 電子量
例えば、光が5秒間に進む距離の計算は以下のようになります。
PRINT VAL("2.99792458E8") * 5 + " m"
- 結果
1498962290 m
プログラム実行例
指数表記の値を数値表記にする
指数表記で書かれた値を数値に直します。
\[1.25\rm{E}+6=1.25 \times 10^{6}\]PRINT VAL("1.25E+6")
1250000
指数表記の値の計算
\(1^{15}\)以上の値は指数表記になります。
PRINT VAL("1E15") - 1
PRINT VAL("1E15") + VAL("1.5E16")
999999999999999
1.6E16
オフライン作業取得
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
TRY
// Ver11以上
DIM version = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\svcVersion")
EXCEPT
// Ver10以下
version = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version")
ENDTRY
IFB VAL(TOKEN(".", version)) <= 10 THEN
// Ver10以下
DIM IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.Visible = TRUE
IFB IE.Offilne = TRUE THEN
PRINT "オフライン作業中です"
ELSE
PRINT "オフライン作業中ではありません"
ENDIF
IE.Quit
ELSE
// Ver11以上
PRINT "オフライン作業は利用できません"
ENDIF
オフライン作業は利用できません
MSGBOXの種別の数値から表示されるボタンを取得
HASHTBL type
type[BTN_YES] = "はい"
type[BTN_NO] = "いいえ"
type[BTN_OK] = "OK"
type[BTN_CANCEL] = "キャンセル"
type[BTN_ABORT] = "中止"
type[BTN_RETRY] = "再試行"
type[BTN_IGNORE] = "無視"
DIM num = INPUT("数値を入力してください。")
IF VAL(num) = ERR_VALUE THEN EXIT
PRINT num
PRINT "----------"
FOR n = 0 TO 6
IF (num AND POWER(2, n)) <> 0 THEN PRINT type[POWER(2, n)]
NEXT
MSGBOX("以下のボタンが表示されます", num)
22
----------
キャンセル
はい
中止
文字列から数字部分のみ抽出
strに指定された文字列から数字の部分のみ抽出します。
DIM str = "日本の税率は10%です。"
DIM res = ""
FOR i = 1 TO LENGTH(str)
DIM s = COPY(str, i, 1)
IF VAL(s) <> ERR_VALUE THEN res = res + s
NEXT
PRINT res
10