定義ファイルのコンテキスト中に、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 | 以上 | |
| <=< /td> | 10 <=9 → false | 以下 | |
| == | 10==9 → false | 等号 | |
| == | 10==9 → false | 等号 | |
| && | true && false → false | 論理積 | |
| || | true || 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 |
| substring(x,y,z) | substring('abcdefg', 3, 5) → 'de' | xの文字列に対して、y番目からz文字目までを取り出す。最初の文字は0です。 |
| 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です。 |
正規表現
| 関数 | 例(数値は丸めています) | 説明 |
|---|---|---|
| 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' | 日付の月の最初の日を求める |