Calculation field: Difference between revisions

Jump to navigation Jump to search
m
no edit summary
mNo edit summary
mNo edit summary
 
(36 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{Stamp|2016-12-10|4.1.0|1.0.7}}
{{Stamp|2018-03-30|4.4.5|1.3.0}}


The values in Calculation fields are calculated from the expressions specified by you in Memento Script, defined herein.
The values in Calculation fields are calculated from the expressions specified by you in Memento Script, defined herein.
Line 54: Line 54:
| '''<big>==</big>'''<br/>'''<big>!=</big>'''<br/>'''<big><</big>'''<br/>'''<big><=</big>'''<br/>'''<big>></big>'''<br/>'''<big>>=</big>''' || <big>equal<br/>not equal<br/>less<br/>less or equal<br/>greater<br/>greater or equal</big> || Binary, relational<br/>Example: if( #{count} '''<big><=</big>''' #{max} , #{count} , #{max} )
| '''<big>==</big>'''<br/>'''<big>!=</big>'''<br/>'''<big><</big>'''<br/>'''<big><=</big>'''<br/>'''<big>></big>'''<br/>'''<big>>=</big>''' || <big>equal<br/>not equal<br/>less<br/>less or equal<br/>greater<br/>greater or equal</big> || Binary, relational<br/>Example: if( #{count} '''<big><=</big>''' #{max} , #{count} , #{max} )
|-
|-
| '''<big>&&</big>'''<br/>'''<big>!!</big>''' || <big>and<br/>or</big> || Binary, for TRUE and FALSE (Boolean)<br/>Example: if( #{Done} '''<big>!!</big>''' ( #{Able} '''<big>&&</big>''' #{Trying} ) , 'Raise' , 'No raise' )
| '''<big>&&</big>'''<br/>'''<big><nowiki>||</nowiki></big>''' || <big>and<br/>or</big> || Binary, for TRUE and FALSE (Boolean)<br/>Example: if( #{Done} '''<big><nowiki>||</nowiki></big>''' ( #{Able} '''<big>&&</big>''' #{Trying} ) , 'Raise' , 'No raise' )
|-
|-
| '''<big>!</big>''' || <big>not</big> || Unary, for TRUE or FALSE (Boolean)<br/>Example: if( '''<big>!</big>''' #{Done} , 'Work' , 'Relax' )
| '''<big>!</big>''' || <big>not</big> || Unary, for TRUE or FALSE (Boolean)<br/>Example: if( '''<big>!</big>''' #{Done} , 'Work' , 'Relax' )
Line 61: Line 61:
== Functions ==
== Functions ==
Functions are available to assist in crafting expressions to calculate a final result. Function calls may be typed into the expression, or the user may use the '''+Function''' button to display a tabbed list of functions that may be used.
Functions are available to assist in crafting expressions to calculate a final result. Function calls may be typed into the expression, or the user may use the '''+Function''' button to display a tabbed list of functions that may be used.
:; Note: The rest of this section documents the available functions. However, while the functions may be better explained here, it may be incomplete or even incorrect. The menus of available functions within Memento when using the '''+Function''' button are quite useful and will always be more recently updated than what is documented here.
; Note: The rest of this section documents the available functions. However, while the functions may be better explained here, it may be incomplete or even incorrect. The menus of available functions within Memento when using the '''+Function''' button are quite useful and will always be more recently updated than what is documented here.


=== Math functions ===
=== Math functions ===
Unless otherwise specified, all numbers are ''real'' numbers.


{| class="wikitable" style="font-size:120%"
{| class="wikitable" style="font-size:120%"
! Function !! Arguments !! Returns
! Function !! Arguments !! Returns
|-
|-
| '''numToStr''' || number || String representation of number
| '''abs''' || ''number''
| Absolute value of ''number''
|-
|-
| '''compareTo''' || string1,<br/>string2 || Zero, if the strings are equal<br/> A negative number, if string1 < string2<br/> A positive number, if string1 > string2
| '''acos''' || ''radians''
| Arc cosine of the angle
|-
|-
| '''compareToIgnoreCase''' || string1,<br/>string2 || Zero, if the strings are equal (ignoring case)<br/> A negative number, if string1 < string2 (ignoring case)<br/> A positive number, if string1 > string2 (ignoring case)
| '''asin''' || ''radians''
| Arc sine of the angle
|-
|-
| '''concat''' || string1,<br/>string2 || String of string2 appended to the end of string1
| '''atan''' || ''radians''
| Arc tangent of the angle
|-
|-
| '''endsWith''' || string1,<br/>string2 || TRUE (1.0), if string1 ends with string2<br/> FALSE (0.0), if it doesn't
| '''atan2''' || ''x, y''
| Arc tangent of an angle, given its rectangular coordinates
|-
|-
| '''equals''' || string1,<br/>string2 || TRUE (1.0), if the strings are identical<br/> FALSE (0.0), if not
| '''ceil''' || ''number''
| Ceiling value of ''number''
|-
|-
| '''equalsIgnoreCase''' || string1,<br/>string2 || TRUE (1.0), if the strings are identical (ignoring case)<br/> FALSE (0.0), if not
| '''cos''' || ''radians''
| Cosine of the angle
|-
|-
| '''indexOf''' || string1,<br/>string2,<br/>index || Within string1 from index to the end, the index of the next occurrence of string2<br/>-1, if no more occurrences
| '''exp''' || ''integer''
| Exponential number ''e'' raised to the power of ''integer''
|-
| '''floor''' || ''number''
| Floor value of ''number''
|-
| '''log''' || ''number''
| Natural logarithm (base ''e'') of ''number''
|-
| '''max''' || ''number1, number2''
| The maximum value of ''number1'' & ''number2''
|-
| '''min''' || ''number1, number2''
| The minimum value of ''number1'' and ''number2''
|-
| '''pow''' || ''number, integer''
| ''number'' raised to the power of ''integer''
|-
| '''rint''' || ''real''
| ''real'' adjusted to the closest integer, returned as a ''real''
|-
| '''round''' || ''real''
| Closest ''integer'' to ''real''
|-
| '''sin''' || ''radians''
| Sine of the angle
|-
| '''sqrt''' || ''number''
| Square root of ''number''
|-
| '''tan''' || ''radians''
| Tangent of the angle
|-
| '''toDegrees''' || ''radians''
| Angle in degrees
|-
| '''toRadians''' || ''degrees''
| Angle in radians
|}
|}


Line 90: Line 135:
! Function !! Arguments !! Returns
! Function !! Arguments !! Returns
|-
|-
| '''datediff''' || date,<br/>date || number of days between the 2 dates
| '''datediff''' || ''date1, date2''
| Number of days between the 2 dates (''date2'' - ''date1'')
|-
|-
| '''dateadd'''<br/>4 arguments || date,<br/>interval days,<br/>interval months,<br/>interval years || date incremented by the date interval
| '''dateadd'''<br/>4 arguments || ''date,<br/>intervalDays,<br/>intervalMonths,<br/>intervalYears''
| ''date'' incremented by the date interval
|-
|-
| '''dateadd'''<br/>7 arguments || date,<br/>interval seconds,<br/>interval minutes,<br/>interval hours,<br/>interval days,<br/>interval months,<br/>interval years || date incremented by the time interval
| '''dateadd'''<br/>7 arguments || ''date,<br/>intervalSeconds,<br/>intervalMinutes,<br/>intervalHours,<br/>intervalDays,<br/>intervalMonths,<br/>intervalYears''
| ''date'' incremented by the time interval
|-
|-
| '''formatDate''' || seconds since start of Jan 1 1970 || equivalent date string
| '''formatDate''' || ''seconds''
| Equivalent date string (seconds since start of Jan 1 1970)
|-
|-
| '''formatDateTime''' || seconds since start of Jan 1 1970 || equivalent date/time string
| '''formatDateTime''' || ''seconds''
| Equivalent date/time string (seconds since start of Jan 1 1970)
|-
|-
| '''formatTime''' || seconds since start of Jan 1 1970 || equivalent time string
| '''formatTime''' || ''seconds''
| Equivalent time string (seconds since start of Jan 1 1970)
|-
|-
| '''now''' || || The current time in seconds since the start of Jan 1 1970<br/>Uses Universal Time (UTC) regardless of local settings or time zone
| '''now''' ||
| The current time in seconds since the start of Jan 1 1970<br/>Uses Universal Time (UTC) regardless of local settings or time zone
|-
|-
| '''relativeTimeStr''' || start time || String describing the elapsed time since the given start time
| '''relativeTimeStr''' || ''startTime''
| String describing the elapsed time since the given start time
|-
|-
| '''formatDuration''' || seconds || duration as a string formatted as MM:SS or H:MM:SS
| '''formatDuration''' || ''seconds''
| Duration as a string formatted as MM:SS or H:MM:SS
|}
|}


=== String functions ===
=== String functions ===
Regarding string functions, an '''''index''''' is the relative number of a character within the string. The first string character has index 0 (zero).


'''[[TBD]]'''
{| class="wikitable" style="font-size:120%"
! Function !! Arguments !! Returns
|-
| '''numToStr''' || ''number''
| String representation of ''number''
|-
| '''compareTo''' || ''string1,<br/>string2''
| Zero, if the strings are equal<br/> A negative number, if ''string1'' < ''string2''<br/> A positive number, if ''string1'' > ''string2''
|-
| '''compareToIgnoreCase''' || ''string1,<br/>string2''
| Zero, if the strings are equal (ignoring case)<br/> A negative number, if ''string1'' < ''string2'' (ignoring case)<br/> A positive number, if ''string1'' > ''string2'' (ignoring case)
|-
| '''concat''' || ''string1,<br/>string2''
| String of ''string2'' appended to the end of ''string1''
<source lang="JavaScript">
concat(#{name}, ', Jr.')
</source>
|-
| '''endsWith''' || ''string1,<br/>string2''
| TRUE (1.0), if ''string1'' ends with ''string2''<br/> FALSE (0.0), if it doesn't
|-
| '''equals''' || ''string1,<br/>string2''
| TRUE (1.0), if the strings are identical<br/> FALSE (0.0), if not
|-
| '''equalsIgnoreCase''' || ''string1,<br/>string2''
| TRUE (1.0), if the strings are identical (ignoring case)<br/> FALSE (0.0), if not
|-
| '''indexOf''' || ''string1,<br/>string2,<br/>index''
| Within ''string1'' from ''index'' to the end, the index of the next occurrence of ''string2''<br/>-1, if no more occurrences
<source lang="JavaScript">
next = indexOf(#{Description}, ' and ', next)
</source>
|-
| '''length''' ||'' string''
| Length of (number of characters in) ''string''
|-
| '''replace''' || ''string,<br/>char1,<br/>char2''
| String of ''string'' with all matching ''char1''s replaced with ''char2''s
<source lang="JavaScript">
replace(#{Description}, ';', '.')
</source>
|-
| '''startsWith''' || ''string1,<br/>string2,<br/>index''
| TRUE (1.0), if ''string1'', starting at position ''index'', starts with ''string2''<br/> FALSE (0.0), if it doesn't
|-
| '''substring''' || ''string,<br/>startIndex,<br/>endIndex''
| The substring of ''string'' that starts at ''startIndex'' and ends at ''endIndex''
|-
| '''toLowerCase''' || ''string''
| The string ''string'' with all uppercase characters converted to lowercase
|-
| '''toUpperCase''' || ''string''
| The string ''string'' with all lowercase characters converted to uppercase
|-
| '''trim''' || ''string''
| The string ''string'' with all "white space" (blanks, tabs, etc) removed from both ends
|}


=== Logical functions ===
=== Logical functions ===
Line 117: Line 228:
! Function !! Arguments !! Returns
! Function !! Arguments !! Returns
|-
|-
| '''if''' || expression,<br/>value if TRUE,<br/>value if FALSE || 3 arguments<br/>One value if a logical expression is TRUE (not equal to 0.0)<br/>and another if it is FALSE (equal to 0.0)<br/>Read it as "If expression is true, then value 1, else value 2"<br/>Example: if(#{remaining} == 0, 'Done', 'Incomplete')
| '''if''' || ''expression,<br/>valueIfTrue,<br/>valueIfFalse'' || One value if a logical expression is TRUE (not equal to 0.0)<br/>and another if it is FALSE (equal to 0.0)<br/>Read it as "If ''expression'' is true, then ''valueIfTrue'', else ''valueIfFalse''"
<source lang="JavaScript">
if(#{remaining} == 0, 'Done', 'Incomplete')
</source>
|-
|-
| '''switch''' || expression,<br/>value/result pairs,<br/>default result || 1+(2*#pairs)+1 arguments<br/>The final result based on matching the expression against the paired values to identify the paired result (or else the default result) to be used<br/>Example: switch(#{count}, 1, 'One', 2, 'Two', 'Many')
| '''switch''' || ''expression,<br/>valueResultPairs,<br/>defaultResult'' || 1+(2*#pairs)+1 arguments<br/>The final result based on matching ''expression'' against the paired '''values''' to identify the paired '''result''' (or else ''defaultResult'') to be used
<source lang="JavaScript">
switch(#{count},
  1, 'One',
  2, 'Two',
  'Many')
</source>
|}
|}
== Accessing values of linked library entries ==
Use the following syntax to get access to the values of Link to Entry and other linking fields:
<source lang="java">
#{link field name.linked field name}
</source>
where '''''link field name''''' is the name of a Link to Entry field, '''''linked field name''''' is the name of a field of a related entry.
You can select a field, including one from a related library, using the '''+Field''' button.
If a link field contains several links, then use an index (starting from zero) to get access to them:
<source lang="java">
#{link field name@0.linked field name}, #{link field name@1.linked field name}, …
</source>
You can specify one of the supported aggregation functions instead of the index:
<source lang="java">
#{link field name@sum.linked field name}
</source>
This expression returns the sum of values of field '''linked field name''' for all entries included into '''link field name'''. The functions supported are: '''sum''', '''avg''', '''min''', and '''max'''.
Use the following syntax to get the number of entries in the library referenced by '''link field name''':
<source lang="java">
#{link field name@size}
</source>
=== Link example: Parents and children ===
Parents contains fields Name and Age. Children has fields Name and Parents (link to entry (many-to-many)).
Add field "Average parent age" (calculation, real, scale 1) to Children and select the related field from the '''+Field''' list: parents.age. Then insert "@avg", making it:
<source lang="JavaScript">#{parents@avg.age}</source>
=== Link example: Orders of products ===
Products has fields SKU, Description, and Price. Orders has fields #, Date, Customer (link to entry (one-to-many)), and Products (link to entry (many-to-many)).
Add field "Total" (calculation, real, scale 2) to Orders and select the related field from the '''+Field''' list: products.price. Then insert "@sum", making it:
<source lang="JavaScript">#{products@sum.price}</source>
'''Note:''' This example points out a deficiency in using a many-to-many relationship for orders of products (or of services). One would hope to associate a quantity for each product ordered, but that requirement cannot be met with this 3-library technique. So, in real life, order solutions generally involve 4 libraries: Customers, Products, Orders, and Order Items. The quantity can reside in Order Items.


== Examples ==
== Examples ==
Line 153: Line 318:
We add a Calculation field Days by using the following expression:
We add a Calculation field Days by using the following expression:
<source lang="java">
<source lang="java">
datediff(#{EndDate}, #{StartDate})
datediff(#{StartDate}, #{EndDate})
</source>
</source>


Line 193: Line 358:
</source>
</source>


== Accessing values of linked library entries ==
== Aggregation functions in Calculation fields ==
Use the following syntax to get access to the values of Link to Entry and other linking fields:
Aggregation functions are used to process multiple values ​​of fields of linked entries and return one value.


<source lang="java">
<source lang="java">
#{link field name.linked field name}
// This function returns the sum of values
</source>
//    ​​of the field called linked_field_name for all entries
 
//    included in link_field_name.
where '''''link field name''''' is the name of a Link to Entry field, '''''linked field name''''' is the name of a field of a related entry.
 
You can select a field, including one from a related library, using the '''+Field''' button.


If a link field contains several links, then use an index (starting from zero) to get access to them:
$sum('link_field_name.linked_field_name')
 
<source lang="java">
#{link field name@0.linked field name}, #{link field name@1.linked field name}, …
</source>
</source>


You can specify one of the supported aggregation functions instead of the index:
Aggregation functions can be used with multiple field of a linked entry. In this case, a pairing operation is specified, which will be applied to the fields before the main aggregation function is applied.
 
<source lang="java">
<source lang="java">
#{link field name@sum.linked field name}
// This function first multiplies the field1 and field2 fields
</source>
//    of the linked entry of the link_field_name field.
// After that the resulting set of numbers is summed.
// The pairwise operation, in this case, is multiplication: '@mul'


This expression returns the sum of values of field '''linked field name''' for all entries included into '''link field name'''. The functions supported are: '''sum''', '''avg''', '''min''', and '''max'''.
$sum('link_field_name.field1', 'link_field_name.field2', '@mul')
 
Use the following syntax to get the number of entries in the library referenced by '''link field name''':
 
<source lang="java">
#{link field name@size}
</source>
</source>


=== Example: Parents and children ===
Note that the function parameters are specified in single quotes.
Parents contains fields Name and Age. Children has fields Name and Parents (link to entry (many-to-many)).


Add field "Average parent age" (calculation, real, scale 1) to Children and select the related field from the '''+Field''' list: parents.age. Then insert "@avg", making it:
{| class="wikitable"
<source lang="JavaScript">#{parents@avg.age}</source>
! Function !! Arguments !! Returns
|-
| $sum || fields, operation (optional, used if multiple argument fields are specified)
| fields &{mdash;} the identifier of the field or attribute of the linked entry in the format: 'link_field_name.linked_field_name'


=== Example: Orders of products ===
: where link_field_name is the name of a Link to Entry field.
Products has fields SKU, Description, and Price. Orders has fields #, Date, Customer (link to entry (one-to-many)), and Products (link to entry (many-to-many)).


Add field "Total" (calculation, real, scale 2) to Orders and select the related field from the '''+Field''' list: products.price. Then insert "@sum", making it:
: where linked_field_name is the name of a field of a linked entry.
<source lang="JavaScript">#{products@sum.price}</source>


'''Note:''' This example points out a deficiency in using a many-to-many relationship for orders of products (or of services). One would hope to associate a quantity for each product ordered, but that requirement cannot be met with this 3-library technique. So, in real life, order solutions generally involve 4 libraries: Customers, Products, Orders, and Order Items. The quantity can reside in Order Items.
If multiple attributes are received from the linked entries, the paired operation is performed before the summation takes place. The function returns the summation. The type of paired operation is defined by the last argument of the function operation(). The type of paired operation is determined by the last argument of the function operation()and can be one of the following:
* '@mul' - multiplication of fields (attributes).
* '@add' - addition of fields (attributes).
* '@sub' - subtraction of fields (attributes) from the field specified first.
* '@div' is the division of the fields (attributes) into the field specified first.


The operation() argument is optional. If it is not specified, then the multiplication operation is used as a default.
|-
| $avg || fields, operation || This function returns the average of values of field linked_field_name for all entries included into link_field_name.
|-
| $min || fields, operation || This function returns the minimum of values of field linked_field_name for all entries included into link_field_name.
|-
| $max || fields, operation || This function returns the maximum of values of field linked_field_name for all entries included into link_field_name.
|}
{{FieldNameHint}}
{{FieldNameHint}}


Line 257: Line 424:


[[Category:Spec]]
[[Category:Spec]]
== Comparison with using a Memento JavaScript field ==
Using a JavaScript field instead of a Calculation field is slightly more involved, due to the fact that unlike a Calculation field, as of this writing, there is no provision to look up a list of JavaScript functions and include them by selection from the list. The other differences are minor.
Whereas in a Calculation field, the value of another field in the library can be referenced by:
<code>#{fieldname}</code>
In a JavaScript field, the same reference would be:
<code>field(fieldname)</code>
So, a script to multiply two fields, such as quantity and price, instead of <code>#{quantity} * #{price}, you would have field("quantity") * field("price")</code>
=== Calling functions ===
The essential remaining difference is the functions that are available, the way general functions are called, and the way functions specific to the field's type (referred to as the type's <i>methods</i>) are called.
In JavaScript, there are two kinds of functions. The first is just like Calculation field functions, except that JavaScript has its own generally different functions to do the same things. For example, to return the maximum of two fields in a Calculation field would be <code>max(#{field1},#{field2}</code>, while in JavaScript, you would have <code>Math.max(field("field1"), field("field2"))</code>.
Then there are unary JavaScript functions that are specific to the type of field. These functions may be called in this same way, such as <code>Math.round(field("field1"))</code>. In JavaScript, there is an alternate way to specify it, which can come in very handy in some cases, and that is <code>field("field1").round()</code>. When written this way, <code>round()</code> is referred to as a <i>method</i> rather than as a function. The distinction is minor. It is essentially the same as a function, except for the way it is written.
=== Operators in Memento JavaScript ===
The following operators are supported:
{| class="wikitable" style="font-size:100%"
! Symbol !! Operator !! Description
|-
| '''<big>(</big>'''<br/>'''<big>)</big>''' || <big>open parenthesis<br/>closed parenthesis</big> || Grouping<br/>Group together a subexpression within an outer expression<br/>Example: '''<big>(</big>'''subexpression 1'''<big>)</big>''' + '''<big>(</big>'''subexpression 2'''<big>)</big>'''
|-
| '''<big>-</big>'''<br/>'''<big>+</big>''' || <big>minus<br/>plus</big> || Unary number<br/>Example: '''<big>-</big>'''5 or '''<big>+</big>'''10
|-
| '''<big>+</big>'''<br/>'''<big>-</big>''' || <big>addition<br/>subtraction</big> || Binary<br/>Example: #{a} '''<big>+</big>''' #{b} '''<big>-</big>''' 1
|-
| '''<big>*</big>'''<br/>'''<big>/</big>''' || <big>multiplication<br/>division</big> || Binary<br/>Example: 6 '''<big>/</big>''' (8 '''<big>*</big>''' 13)
|-
| '''<big>%</big>''' || <big>modulo</big> || Binary, integer remainder after division<br/>Example: #{months} '''<big>%</big>''' 12
|-
| '''<big>==</big>'''<br/>'''<big>!=</big>'''<br/>'''<big><</big>'''<br/>'''<big><=</big>'''<br/>'''<big>></big>'''<br/>'''<big>>=</big>''' || <big>equal<br/>not equal<br/>less<br/>less or equal<br/>greater<br/>greater or equal</big> || Binary, relational<br/>Example: if( field("count") '''<big><=</big>''' field("max") , field("count") , field("max") )
|-
| '''<big>&&</big>'''<br/>'''<big><nowiki>||</nowiki></big>''' || <big>and<br/>or</big> || Binary, for TRUE and FALSE (Boolean)<br/>Example: if( field("Done") '''<big><nowiki>||</nowiki></big>''' ( field("Able") '''<big>&&</big>''' field("Trying") ) , 'Raise' , 'No raise' )
|-
| '''<big>!</big>''' || <big>not</big> || Unary, for TRUE or FALSE (Boolean)<br/>Example: if( '''<big>!</big>''' field("Done") ) 'Work' else 'Relax' )
|}
=== Functions and methods of Memento JavaScript ===
Functions are available to assist in crafting expressions to calculate a final result. Function calls may be typed into the expression, or the user may use the '''+Function''' button to display a tabbed list of functions that may be used.
; Note: The rest of this section documents the available functions. However, while the functions may be better explained here, it may be incomplete or even incorrect. The menus of available functions within Memento when using the '''+Function''' button are quite useful and will always be more recently updated than what is documented here.
=== Math functions ===
Unless otherwise specified, all numbers are ''real'' numbers. As a general case, when the table refers to a <i>variable</i>, a field value reference may be used instead, such as <code>field(<i>fieldname</i>)</code> or <code>field(<i>"MyField"</i>)</code>.
{| class="wikitable" style="font-size:100%"
! Function !! Arguments !! Returns !! Function example !! Method example
|-
| <code>'''abs'''</code> || ''number''
| Absolute value of ''number''
| <code>Math.abs(delta)</code> || <code>delta.abs()</code>
|-
| <code>'''acos'''</code> || ''radians''
| Arc cosine of the angle
|-
| <code>'''asin'''</code> || ''radians''
| Arc sine of the angle
|-
| <code>'''atan'''</code> || ''radians''
| Arc tangent of the angle
|-
| <code>'''atan2'''</code> || ''x, y''
| Arc tangent of an angle, given its rectangular coordinates
|-
| <code>'''ceil'''</code> || ''number''
| Ceiling value of ''number''
|-
| <code>'''cos'''</code> || ''radians''
| Cosine of the angle
|-
| <code>'''exp'''</code> || ''integer''
| Exponential number ''e'' raised to the power of ''integer''
|-
| <code>'''floor'''</code> || ''number''
| Floor value of ''number''
|-
| <code>'''log'''</code> || ''number''
| Natural logarithm (base ''e'') of ''number''
|-
| <code>'''max'''</code> || ''number1, number2''
| The maximum value of ''number1'' & ''number2''
|-
| <code>'''min'''</code> || ''number1, number2''
| The minimum value of ''number1'' and ''number2''
|-
| <code>'''pow'''</code> || ''number, integer''
| ''number'' raised to the power of ''integer''
|-
| <code>'''rint'''</code> || ''real''
| ''real'' adjusted to the closest integer, returned as a ''real''
|-
| <code>'''round'''</code> || ''real''
| Closest ''integer'' to ''real''
|-
| <code>'''sin'''</code> || ''radians''
| Sine of the angle
|-
| <code>'''sqrt'''</code> || ''number''
| Square root of ''number''
|-
| <code>'''tan'''</code> || ''radians''
| Tangent of the angle
|-
| <code>'''toDegrees'''</code> || ''radians''
| Angle in degrees
|-
| <code>'''toRadians'''</code> || ''degrees''
| Angle in radians
|}
=== Date/Time Functions ===
{| class="wikitable" style="font-size:120%"
! Function !! Arguments !! Returns
|-
| '''datediff''' || ''date1, date2''
| Number of days between the 2 dates (''date2'' - ''date1'')
|-
| '''dateadd'''<br/>4 arguments || ''date,<br/>intervalDays,<br/>intervalMonths,<br/>intervalYears''
| ''date'' incremented by the date interval
|-
| '''dateadd'''<br/>7 arguments || ''date,<br/>intervalSeconds,<br/>intervalMinutes,<br/>intervalHours,<br/>intervalDays,<br/>intervalMonths,<br/>intervalYears''
| ''date'' incremented by the time interval
|-
| '''formatDate''' || ''seconds''
| Equivalent date string (seconds since start of Jan 1 1970)
|-
| '''formatDateTime''' || ''seconds''
| Equivalent date/time string (seconds since start of Jan 1 1970)
|-
| '''formatTime''' || ''seconds''
| Equivalent time string (seconds since start of Jan 1 1970)
|-
| '''now''' ||
| The current time in seconds since the start of Jan 1 1970<br/>Uses Universal Time (UTC) regardless of local settings or time zone
|-
| '''relativeTimeStr''' || ''startTime''
| String describing the elapsed time since the given start time
|-
| '''formatDuration''' || ''seconds''
| Duration as a string formatted as MM:SS or H:MM:SS
|}
=== String functions ===
Regarding string functions, an '''''index''''' is the relative number of a character within the string. The first string character has index 0 (zero).
{| class="wikitable" style="font-size:120%"
! Function !! Arguments !! Returns
|-
| '''numToStr''' || ''number''
| String representation of ''number''
|-
| '''compareTo''' || ''string1,<br/>string2''
| Zero, if the strings are equal<br/> A negative number, if ''string1'' < ''string2''<br/> A positive number, if ''string1'' > ''string2''
|-
| '''compareToIgnoreCase''' || ''string1,<br/>string2''
| Zero, if the strings are equal (ignoring case)<br/> A negative number, if ''string1'' < ''string2'' (ignoring case)<br/> A positive number, if ''string1'' > ''string2'' (ignoring case)
|-
| '''concat''' || ''string1,<br/>string2''
| String of ''string2'' appended to the end of ''string1''
<source lang="JavaScript">
concat(#{name}, ', Jr.')
</source>
|-
| '''endsWith''' || ''string1,<br/>string2''
| TRUE (1.0), if ''string1'' ends with ''string2''<br/> FALSE (0.0), if it doesn't
|-
| '''equals''' || ''string1,<br/>string2''
| TRUE (1.0), if the strings are identical<br/> FALSE (0.0), if not
|-
| '''equalsIgnoreCase''' || ''string1,<br/>string2''
| TRUE (1.0), if the strings are identical (ignoring case)<br/> FALSE (0.0), if not
|-
| '''indexOf''' || ''string1,<br/>string2,<br/>index''
| Within ''string1'' from ''index'' to the end, the index of the next occurrence of ''string2''<br/>-1, if no more occurrences
<source lang="JavaScript">
next = indexOf(#{Description}, ' and ', next)
</source>
|-
| '''length''' ||'' string''
| Length of (number of characters in) ''string''
|-
| '''replace''' || ''string,<br/>char1,<br/>char2''
| String of ''string'' with all matching ''char1''s replaced with ''char2''s
<source lang="JavaScript">
replace(#{Description}, ';', '.')
</source>
|-
| '''startsWith''' || ''string1,<br/>string2,<br/>index''
| TRUE (1.0), if ''string1'', starting at position ''index'', starts with ''string2''<br/> FALSE (0.0), if it doesn't
|-
| '''substring''' || ''string,<br/>startIndex,<br/>endIndex''
| The substring of ''string'' that starts at ''startIndex'' and ends at ''endIndex''
|-
| '''toLowerCase''' || ''string''
| The string ''string'' with all uppercase characters converted to lowercase
|-
| '''toUpperCase''' || ''string''
| The string ''string'' with all lowercase characters converted to uppercase
|-
| '''trim''' || ''string''
| The string ''string'' with all "white space" (blanks, tabs, etc) removed from both ends
|}
=== Logical functions ===
{| class="wikitable" style="font-size:120%"
! Function !! Arguments !! Returns
|-
| '''if''' || ''expression,<br/>valueIfTrue,<br/>valueIfFalse'' || One value if a logical expression is TRUE (not equal to 0.0)<br/>and another if it is FALSE (equal to 0.0)<br/>Read it as "If ''expression'' is true, then ''valueIfTrue'', else ''valueIfFalse''"
<source lang="JavaScript">
if(#{remaining} == 0, 'Done', 'Incomplete')
</source>
|-
| '''switch''' || ''expression,<br/>valueResultPairs,<br/>defaultResult'' || 1+(2*#pairs)+1 arguments<br/>The final result based on matching ''expression'' against the paired '''values''' to identify the paired '''result''' (or else ''defaultResult'') to be used
<source lang="JavaScript">
switch(#{count},
  1, 'One',
  2, 'Two',
  'Many')
</source>
|}

Navigation menu