定義ファイルのコンテキスト中に、calculationキーで指定する計算式の規則をこのページで紹介します。計算式自体はさらに配列中のexpressionキーの文字列で指定します。
以下の演算子や関数を使い、フィールド名や「コンテキスト名@フィールド名」の形式で別のデータを参照できます。ただし、calculationキーがあるコンテキストでは、keyキーによる主キーの指定が必要です。また、文字列はシングルクォーテーションによる囲みのみです。ダブルクォートは利用できません。言い換えれば、expressionキーに対応する文字列は "" で囲い、式の中の文字列リテラルはシングルクォートを利用します。
項
種類 | 例 | 説明 |
---|---|---|
数値リテラル | 10.3 | |
文字列リテラル | 'abc' | シングルクォートでの囲みのみ。シングルクォートは\で要エスケープ |
定数 | PI | EとPIが定義されている |
ターゲット指定 | person@住所 | 展開されている対応するノードを参照。同一のコンテキスト内ならフィールド名のみ |
定数
定数 | 対応するJavaScript | 解説 |
---|---|---|
E | Math.E | エクスポーネンシャル |
PI | Math.PI | 円周率 |
演算子
対象データ | 演算子 | 記述例 | 解説 |
---|---|---|---|
数値 | ^ | 2^3 の結果は 8 | べき乗 |
+ | 2+3 の結果は 5 | 加算 | |
- | 3-2 の結果は 1 | 減算(あるいは負の数) | |
* | 3*2 の結果は 6 | 乗算 | |
/ | 3/2 の結果は 1.5 | 除算 | |
% | 3%2 の結果は 1 | 剰余 | |
文字 | + | 'a'+'b' の結果は 'ab' | 結合 |
⊕ | 3⊕5 の結果は '35' | 結合(文字列として) | |
- | 'abc'-'c' の結果は 'ab' | 除去 | |
∩ | 'abcdef' ∩ 'bdfx' の結果は 'bdf' | 共通の文字 | |
∪ | 'abcdef' ∪ 'bdfx' の結果は 'abcdefx' | 両方の文字 | |
⊁ | 'abcdef' ⊁ 'bdfx' の結果は 'ace' | 文字の除去 | |
論理演算 | = | 10=9 の結果は false | 等号 |
== | 10==9 の結果は false | 等号 | |
!= | 10!=9 の結果は true | 不等号 | |
<> | 10<>9 の結果は true | 不等号 | |
> | 10>9 の結果は true | より大 | |
< | 10<9 の結果は false | より小 | |
>= | 10>=9 の結果は true | 以上 | |
<= | 10 <=9 の結果は false | 以下 | |
== | 10==9 の結果は false | 等号 | |
|| | true || false の結果は true | 論理和 | |
&& | true && false の結果は false | 論理積 | |
! | ! true の結果は false | 論理否定 | |
→ | true → false の結果はfalse、それ以外はtrue | 論理包含 | |
文字リスト | ⋀ | 'abc¶dff¶ghi' ⋀ 'dff¶stu¶' の結果は 'dff¶' | 共通項 |
⋁ | 'abc¶dff¶ghi' ⋁ 'xyz¶stu¶' の結果は 'abc¶dff¶ghi¶xyz¶stu¶' | 合同 | |
⊬ | 'abc¶dff¶ghi' ⊬ 'ghi¶dkg¶' の結果は 'abc¶dff¶' | 差演算 |
加算について
- 2つの項がいずれも数値なら、数値として計算します。
- 2つの項がいずれかでも数値に変換できないか文字列なら、文字列として計算します。
減算について
- 2つの項がいずれも数値なら、数値として計算します。
- 2つの項がいずれかでも数値に変換できないか文字列なら、文字列として計算します。
文字リストの改行の扱いについて
- 引数の最後に改行があってもなくてもかまいません。
- 結果の最後には改行が付きます。
- 最後の改行の扱いも含めて、長さが0の項目は項目として扱わず無視します。
- 3種類ある改行のどれも同じように扱いますが、結果の改行は最初の引数の最初に出てくる改行になります。
関数
数値
関数 | 例(数値は丸めています) | 説明 |
---|---|---|
abs(x) | abs(-3.1) の結果は 3.1 | 絶対値 |
ceil(x) | ceil(-3.1) の結果は -3 | 引数よりも大きな整数のうちの最小値 |
floor(x) | floor(-3.1) の結果は -4 | 引数よりも小さな整数のうちの最大値 |
round(x,y) | round(3.1415, 2) の結果は 3.14 | 1つ目の引数を四捨五入、2つ目の引数は少数以下の桁数で、正の数なら10の位から上位に上がる |
format(x,y) | format(12345, 0) の結果は 12,345 | xを数値として、小数以下y桁目で四捨五入する。0以上の値は3桁ごとにカンマを付与する。 |
sqrt(x) | sqrt(3) の結果は 1.73 | 平方根 |
exp(x) | exp(0.5) の結果は 1.65 | ネイピア数eのx乗 |
log(x) | log(0.5) の結果は -0.69 | ネイピア数を底とする自然対数 |
random() | random() の結果は 0.254 | 0〜1の範囲の乱数 |
pow(x, y) | pow(2,3) の結果は 8 | べき乗、xのy乗 |
fac(x) | fac(5) の結果は 120 | 累乗、x!の値 |
pyt(x) | pyt(3,4) の結果は 5 | x^2+y^2の平方根 |
集計
関数 | 例(数値は丸めています) | 説明 |
---|---|---|
sum(x,...) | sum(1,2,3,4,5) の結果は 15 | 合計。引数は可変 |
min(x,...) | min(3,1,2,1,5,1) の結果は 1 | 引数の最小値。引数は可変 |
max(x,...) | max(3,1,2,1,5,1) の結果は 5 | 引数の最大値。引数は可変 |
判断
関数 | 例(数値は丸めています) | 説明 |
---|---|---|
if(x,y,z) | if(10 >= 1,'b','c') の結果は 'b' | 最初の引数の結果がtrueなら2番目、falseなr3番目を返す |
choice(x, a1, a2, ..., an) | choice(2,'a','b','c','d','e') の結果は 'c' | 最初の引数の結果が0以上なら引数のいずれかを返す。0なら1番目の引数の値、1なら2番目の引数の値、....nなら(n+1)番目の引数の値を返す。最初の引数が範囲0〜nを越えるとundefinedを返す。最初の引数がnullあるいはundefinedなら、それぞれnullあるいはundefinedを返す |
condition(x1, a1, x2, a2, ..., xn, an) | condition(3>10, 'a', 13>10, 'b', 23>10, 'c') の結果は 'b' | 奇数番目の引数の値を1番目から調べて、最初にtrueになった引数の次の引数を返す。奇数番目の引数にtrueのものがないとundefinedを返す |
accumulate(x1, a1, x2, a2, ..., xn, an) | accumulate(3>10, 'a', 13>10, 'b'', 23>10, 'c') の結果は 'b¶c¶' | 奇数番目の引数の値を1番目から調べ、すべてのtrueになる奇数番目の引数に対し、その次の引数をLF(0x10)を改行とした文字列リストの形式で返す。奇数番目にtrueのものがない場合には''を返す。 |
文字列
関数 | 例 | 説明 |
---|---|---|
length() | length('test') の結果は 4 | 引数の文字列の長さを求める。nullが引数なら0を返す |
substr(x,y,z) | substr('abcdefg', 3, 2) の結果は 'de' | xの文字列に対して、y番目からz文字分のみを取り出す。最初の文字は0だが、文字位置は文字間の隙間をカウントするものとするので、最初の文字の前は0、次の隙間が1。yとzは負の数も受け付ける。yが負の数の場合は、最後の文字の前が-1、その前の文字の前が-2。zが負の数の場合はその文字より前にカウントする。 |
substring(x,y,z) | substring('abcdefg', 3, 5) の結果は 'de' | xの文字列に対して、y番目からz文字目までを取り出す。最初の文字は0だが、文字位置は文字間の隙間をカウントするものとするので、最初の文字の前は0、次の隙間が1。yとzが負の数の場合は、最後の文字の前が-1、その前の文字の前が-2。 |
left(x,y) | left('abcdefg', 3) の結果は 'abc' | xの文字列に対して、最初からy文字目までを取り出す |
mid(x,y,z) | mid('abcdefg', 3, 2) の結果は 'de' | xの文字列に対して、y文字目からz文字分を取り出す。最初の文字は0です。 |
right(x,y) | right('abcdefg', 3) の結果は 'efg' | xの文字列に対して、最後からy文字分を取り出す |
indexof(x, y, fr) | indexof('abcdefg','cd') の結果は 2 | xの文字列の最初からyの文字列を探し、最初に見つかった場所を返す。引数frを指定するとその文字以降を探すが、省略すると最初から。JavaScriptのString.indexOfを利用。最初の文字は0です。 |
lastindexof(x,y) | indexof('abcdefg','cd') の結果は 2 | xの文字列の最後からyの文字列を探し、最初に見つかった場所を返す。引数frを指定するとその文字以降を探すが、省略すると最初から。JavaScriptのString.lastIndexOfを利用。最初の文字は0です。 |
replace(x,y,z,w) | replace('abcdefgabc', 5, 8, 'yz') の結果は 'abcdeyzbc' | xの文字列のy番目からz文字分を、文字列wに置き換える。最初の文字は0です。 |
substitute(x,y,z) | substitute('abcdefgabc', 'bc', 'yz') の結果は 'ayzdefgayz' | xの文字列内にあるすべての文字列yを文字列zに置き換える。最初の文字は0です。 |
basename(path) | basename('dir/subdir/afile.txt') の結果は 'afile.txt' | 引数の文字列をパスとして認識して、ファイル名を求める |
extname(path) | extname('dir/subdir/afile.txt') の結果は 'txt' | 引数の文字列をパスとして認識して、拡張子を求める |
dirname(path) | dirname('dir/subdir/afile.txt') の結果は 'dir/subdir' | 引数の文字列をパスとして認識して、ディレクトリ名を求める |
decodeURI(str) | decodeURI('%28Z%29') の結果は '(Z)' | JavaScriptのdecodeURI関数と同一の動作 |
encodeURI(str) | encodeURI('(Z)') の結果は'%28Z%29' | JavaScriptのencodeURI関数と同一の動作 |
decodeURIComponent(str) | decodeURIComponent('%28Z%29') の結果は '(Z)' | JavaScriptのdecodeURIComponent関数と同一の動作 |
encodeURIComponent(str) | encodeURIComponent('(Z)') の結果は'%28Z%29' | JavaScriptのencodeURIComponent関数と同一の動作 |
jsonparse(jsonstr, path) | jsonparse('{"a":1,"b":2,"c":[4,5,6],"d":{"a":7,"b":8}}','c.1')の値は5 | 最初の引数は文字列化されたJSONを指定、pathにドットで区切ってルートからのキーを記述することで、JSON内部のデータを取り出すことができる。配列の場合は数値を指定する |
正規表現
関数 | 例 | 説明 |
---|---|---|
test(str, reg) | test('123a456', '[^0-9]') の結果はtrue | 文字列strに対して、文字列regで表現した正規表現の検査を行い、マッチすればtrueを返す |
match(str, reg) | match('123a456', '[0-9]([^0-9])([0-9]') の結果は['3a4', 'a', '4'] | 文字列strに対して、文字列regで表現した正規表現の検索を行う。マッチすれば配列を返す。要素0は正規表現に対する最後にマッチングした文字列、要素1以降は、( ) の部分に対応する文字列 |
文字リスト
関数 | 例 | 説明 |
---|---|---|
items(x,y,z) | items(x,0,1) の結果は'abc¶' | 文字列リストxに対して、y番目からz項目分を文字列リストとして取り出す。最初の文字は0です。 |
itemIndexOf(x,y) | items(x,'abc') の結果は0 | 文字列リストxに対して、yの文字列が何番目の項目かを求めて返す。 見つからない場合は、-1を返す。空行の連続では '' が要素として存在するものとして判定する。最初の文字は0です。 |
三角関数
関数 | 例(数値は丸めています) | 説明 |
---|---|---|
sin(x) | sin(PI/4) の結果は 0.71 | |
cos(x) | cos(PI/4) の結果は 0.71 | |
tan(x) | tan(PI/4) の結果は 1 | |
tan2(x,y) | tan2(0.5, 0.5) の結果は PI/4 | |
asin(x) | asin(0.71) の結果は PI/4 | |
acos(x) | acos(0.71) の結果は PI/4 | |
atan(x) | atan(1) の結果は PI/4 |
日付時刻の関数
関数 | 例 | 説明 |
---|---|---|
date(str) | date('2014-02-18') の結果は | 引数に指定した文字列の日付に対応する整数を返す。数値は1970/1/1からの日数。引数をそのままJavaScriptのDateクラスで処理をする |
datetimestr) | datetime('2014-02-17 09:00:01') の結果は | 引数に指定した文字列の日時に対応する整数を返す。数値は1970/1/1からの秒数。引数をそのままJavaScriptのDateクラスで処理をする |
datecomponents(y,m,d) | datecomponents(2014,2,17) の結果は | 引数に、年月日を指定して、その日付に対応する整数を返す。数値は1970/1/1からの日数 |
datetimecomponents(y,m,d,h,i,s) | datetimecomponents(2014,2,17,9,0,0) の結果は | 引数に、年月日時分秒を指定して、その日時に対応する整数を返す。数値は1970/1/1からの秒数 |
today() | today() の結果は | 今現在の日付を指定する整数を返す。数値は1970/1/1からの日数 |
now() | now() の結果は | 今現在の日時を指定する整数を返す。数値は1970/1/1からの秒数 |
year(x) | year(datetime('2014-02-17')) の結果は 2014 | 日付ないしは日時から年を求める |
month(x) | month(datetime('2014-02-17')) の結果は 2 | 日付ないしは日時から月を求める |
day(x) | day(datetime('2014-02-17')) の結果は 17 | 日付ないしは日時から日を求める |
weekday(d) | weekday(datetime('2014-02-17 09:23:49') の結果は 1 | 日付ないしは日時からから曜日を求める |
hour(x) | hour(datetime('2014-02-17 09:23:49') の結果は 9 | 日付ないしは日時から時を求める |
minute(x) | minute(datetime('2014-02-17 09:23:49') の結果は 23 | 日付ないしは日時から分を求める |
second(x) | second(datetime('2014-02-17 09:23:49') の結果は 49 | 日付ないしは日時から秒を求める |
yeardt(d) | yeardt(datetime('2014-02-17')) の結果は 2014 | 日時から年を求める |
monthdt(d) | monthdt(datetime('2014-02-17')) の結果は 2 | 日時から月を求める |
daydt(d) | daydt(datetime('2014-02-17')) の結果は 17 | 日時から日を求める |
weekdaydt(d) | weekdaydt(datetime('2014-02-17 09:23:49') の結果は 1 | 日時から曜日を求める |
hourdt(d) | hourdt(datetime('2014-02-17 09:23:49') の結果は 9 | 日時から時を求める |
minutedt(d) | minutedt(datetime('2014-02-17 09:23:49') の結果は 23 | 日時から分を求める |
seconddt(d) | seconddt(datetime('2014-02-17 09:23:49') の結果は 49 | 日時から秒を求める |
yeard(d) | yeard(date('2014-02-17')) の結果は 2014 | 日付から年を求める |
monthd(d) | monthd(date('2014-02-17') の結果は 2 | 日付から月を求める |
dayd(d) | dayd(date('2014-02-17') の結果は 17 | 日付から日を求める |
weekdayd(d) | weekdayd(date('2014-02-17') の結果は 1 | 日付から曜日を求める |
addyear(d, x) | addyear(datetime('2014-02-17 09:23:49'), 2) の結果は '2016-02-17 09:23:49' | 日付ないしは日時に指定した年を加える |
addmonth(d, x) | addmonth(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-04-17 09:23:49' | 日付ないしは日時に指定した月を加える |
addday(d, x) | addday(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-02-19 09:23:49' | 日付ないしは日時に指定した日を加える |
addhour(d, x) | addhour(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-02-17 11:23:49' | 日付ないしは日時に指定した時を加える |
addminute(d, x) | addminute(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-02-17 09:25:49' | 日付ないしは日時に指定した分を加える |
addsecond(d, x) | addsecond(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-02-17 09:23:51' | 日付ないしは日時に指定した秒を加える |
endofmonth(d) | endofmonth(datetime('2014-02-17 09:23:49') の結果は '2014-02-28' | 日付ないしは日時の月の最終日を求める |
startofmonth(d) | startofmonth(datetime('2014-02-17 09:23:49') の結果は '2014-02-01' | 日付ないしは日時の月の最初の日を求める |
addyeardt(d, x) | addyeardt(datetime('2014-02-17 09:23:49'), 2) の結果は '2016-02-17 09:23:49' | 日時に指定した年を加える |
addmonthdt(d, x) | addmonthdt(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-04-17 09:23:49' | 日時に指定した月を加える |
adddaydt(d, x) | adddaydt(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-02-19 09:23:49' | 日時に指定した日を加える |
addhourdt(d, x) | addhourdt(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-02-17 11:23:49' | 日時に指定した時を加える |
addminutedt(d, x) | addminutedt(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-02-17 09:25:49' | 日時に指定した分を加える |
addseconddt(d, x) | addseconddt(datetime('2014-02-17 09:23:49'), 2) の結果は '2014-02-17 09:23:51' | 日時に指定した秒を加える |
endofmonthdt(d) | endofmonthdt(datetime('2014-02-17 09:23:49') の結果は '2014-02-28' | 日時の月の最終日を求める |
startofmonthdt(d) | startofmonthdt(datetime('2014-02-17 09:23:49') の結果は '2014-02-01' | 日時の月の最初の日を求める |
addyeard(d, x) | addyeard(date('2014-02-17'), 2) の結果は '2016-02-17' | 日付に指定した年を加える |
addmonthd(d, x) | addmonthd(date('2014-02-17'), 2) の結果は '2014-04-17' | 日付に指定した月を加える |
adddayd(d, x) | adddayd(date('2014-02-17'), 2) の結果は '2014-02-19' | 日付に指定した日を加える |
endofmonthd(d) | endofmonthd(date('2014-02-17') の結果は '2014-02-28' | 日付の月の最終日を求める |
startofmonthd(d) | startofmonthd(date('2014-02-17') の結果は '2014-02-01' | 日付の月の最初の日を求める |