定義ファイルのコンテキスト中に、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' 日付の月の最初の日を求める