プログラミング
逆引き
クライアントとの通信
VisMでの通信
Factoryでの通信
WebServiceでの通信
CSP (Cache' Server Pages)
Cache'SQL
設定・性能


【広告】









逆引きCache' Object Script

Cache' Object Script

文字列 数値 ファイル 日時 ユーティリティ

数値

Cache'の数値

「Cache'にはデータ型がない」と言われたりします。
…が、内部では実は色々なデータ型が存在しているようです。オブジェクトとか、リストとか…。
数値もその中のひとつです。
Cache'の数値には、いくつか独特のクセがあります。知らないとハマることがあるので、要注意です。

有効桁数

18桁。それ以上では桁落ちが発生する。

システムにとって必要のないゼロは除去される

-1〜1の間の少数は特に注意が必要です。
演算結果を出力する場合、-1〜1になる可能性があるならば、必ず$FNumber等で表示用に成形する必要があります。「数値を表示形式に変換する」を参照してください。
> Set a=00147
> Write a        //これは他の言語でも同様かと
147
> Set a=0.05000
> Write a    // !
.05
> Set a=-0.00100
> Write a    // !!
-.001

配列のキー部で自動的に数値型にされてしまう

配列のキー部に入れる場合、数値化が可能な文字列は数値化されてキーに格納されてしまいます。
$Orderで順番に取り出そうとしてもうまくいかないので、注意してください。

> S array("1A")=""
> S array("2B")=""
> ZWrite array         //正しくソートされていることを確認
array("1A")=""
array("2B")=""

> S array("10")=""     //引き続き...
> S array("20")=""
> ZWrite array         //表示すると、数値化されているため期待した並びにならない
array(10)=""
array(20)=""
array("1A")=""
array("2B")=""

文字列から数値を得る

プラス記号を付けると、先頭から数値部分が取り出されます。

> Set a="42.195キロメートル"
> Write +a
42.195

外部からの入力の場合は、先に文字列のパターンマッチによるフォーマットチェックを実施することを強く勧めます。簡単な例を次に示します。

> Set a="2E1000"
> Write +a
W +a
^
<MAXNUMBER>

> if a'?1.N Write "数値ではない"
数値ではない

3桁ごとに , が入ったりすると、フォーマットチェックも難しくなってきます。そんな時は$INUMBERを使いましょう。

> Write $INumber("19,800",",")
19800
> Write $INumber("19,80,0",",")   //3桁ごとの区切りの,が正しくないので<ILLIGAL VALUE>エラーが発生
<ILLEGAL VALUE>

> Write $INumber("1,980.55",",")
1980.55
> Write $INumber("19800.5.4", ",", "BAD")
                               //小数点が2回出現。第三引数が指定されているので<ILLIGAL VALUE>エラーは発生しない
BAD

文字列の途中に数値がある場合は、$ZStripで抽出することもできます。
> Write $ZStrip("東京ドーム12個分の","*E",,"0123456789.-")
12

四則演算

+ 足す、- 引く、* かける、/ 割る、\商、# 余り、** 累乗
演算は( )がない限り、全て左側から行われます。

> Write 2+3*4   //左から演算が実施されるので、先に2+3を実行
20
> Write 2+(3*4) // ()内が先に実行される
14

四捨五入

$NUMBER関数を使用します。$NUMBERの第2引数で小数点以下何桁の値が欲しいかを指定します。

> Write $Number(42.195,1) //四捨五入で小数点下1桁を要求
42.2

> Write $Number(42.195,2) //四捨五入で小数点下2桁を要求 42.20が得られ、表記上0が削られる
42.2

第2引数に0を指定すると整数が得られます。

> Write $Number(42.195,0) //四捨五入で整数を要求
42

第2引数に負の値nを指定すると 10^(ABS(n)) の位で丸められます。

> Write $Number(42.195,-1) //1の位を四捨五入
40

> Write $Number(512, -2) //10の位を四捨五入
500

整数部を取得、小数部を切り捨てる

$NORMALIZE(数値,-1)を使用します。

> Write $Normalize(42.195, -1)
42

> Write $Normalize(9.999, -1)  //四捨五入ではない
9

商を求める \ 演算子を使って、1で割った時の値を使う方法もあります。
> Write 3.14\1
3

数値を表示形式に変換する

$FNumberを使って数値を表示用に整形します。

> Write $FNumber(1000000, ",") //3桁ごとに,を表示
1,000,000

> Write $FNumber(1000000, "E") //対数表示
1.000000E+06

> Write $FNumber(123456.123456, ",", 2) //小数部分2桁を残して四捨五入
123,456.12

> Write $FNumber(0.05000,",",3) //小数点より前の0を落とさない。小数点以下3桁まで表示
0.050

> Write $FNumber(-0.05000,",",3) //マイナスでも大丈夫
-0.050

数学関数いろいろ

関数概要
$ZABS絶対値の関数です。
$ZARCCOS逆(アーク)コサイン関数です。
$ZARCSIN逆(アーク)サイン関数です。
$ZARCTAN逆(アーク)タンジェント関数です。
$ZCOSコサイン関数です。
$ZCOTコタンジェント関数です。
$ZCSCコセカント関数です。
$ZEXP指数関数(自然対数の逆関数)
$ZHEX16進数文字列を10進数値に、あるいは10進数値を16進数値に変換します。
$ZLN指定された数の自然対数を返します。
$ZLOG指定された正の数の式の、常用対数の値を返します。
$ZPOWERある数字に選択した数を累乗して返します。
$ZSEC指定された角度の三角関数のセカントを返します。
$ZSIN指定された角度の三角関数のサインを返します。
$ZSQR指定された数の平方根の値を返します。
$ZTAN指定された角度の三角関数のタンジェントを返します。