# ArithmeticExpression

A collection of arithmetic functions and operations, which other Watch Face Format elements use to resolve real-time attribute values and gyroscopic effects.

Introduced in Wear OS 4.

## Example

An example expression for rotating a value up to 5 degrees in either direction, based on the $x$-value of the Wear OS device's accelerometer:

(5/90)*clamp([ACCELEROMETER_ANGLE_X],0,90) + (-5/90)*clamp([ACCELEROMETER_ANGLE_X],-90,0)


...which is equivalent to the following mathematical expression, where $\theta_x$ represents the accelerometer angle in the $x$-direction:

$$\frac{5}{90} * max(min(\theta_x, 90), -90)$$

## Functions

The Watch Face Format recognizes the following string values as functions:

round()
Converts the input value to a floating-point value, then performs the standard round() mathematical operation.
floor()
Performs the standard floor() mathematical operation.
ceil()
Performs the standard ceil() mathematical operation.
fract()
Returns the fractional part of the input value; that is, the part of the floating-point value that appears to the right of the decimal point.
sin()
Performs the standard sin() trigonometric operation.
cos()
Performs the standard cos() trigonometric operation.
tan()
Performs the standard tan() trigonometric operation.
asin()
Performs the standard asin() trigonometric operation. The returned value is always in the range $[-\frac{\pi}{2}, \frac{\pi}{2}]$.
acos()
Performs the standard acos() trigonometric operation. The returned value is always in the range $[0.0, \pi]$.
atan()
Performs the standard atan() trigonometric operation. The returned value is always in the range $[-\frac{\pi}{2}, \frac{\pi}{2}]$.
abs()
Converts the input value to a floating-point value, then performs the standard abs() mathematical operation.
clamp(,,)
Converts the input values to floating-point values, then performs the clamp() Jetpack operation to fit the first value in the range defined by the second and third values.
rand(,)

Generates a random floating-point value that fulfills the following conditions at the same time:

• Greater than or equal to the first value.
• Less than or equal to the second value.

Assumes that the first value is less than or equal to the second value.

log()

Performs the standard base-$e$ log() mathematical operation.

log2()

Simulates a base-2 logarithm. This value is calculated by dividing the base-10 logarithm (log10 of the input value) by the base-10 logarithm of $2$.

log10()

Performs the standard base-10 log10 mathematical operation.

sqrt()

Performs the standard sqrt() mathematical operation.

cbrt()

Performs the standard cbrt() mathematical operation.

exp()

Performs the standard exp() mathematical operation.

expm1()

Directly calls the expm1() mathematical operation if the input value is $1$. For any other input value, simulates the function by performing the standard exp() mathematical operation, then subtracting 1.

deg()

Performs the standard toDegrees() mathematical operation. $\frac{\pi}{2}$ is defined as 90 degrees, and $\pi$ is defined as 180 degrees.

rad()

Performs the standard toRadians() mathematical operation. 90 degrees is defined as $\frac{\pi}{2}$, and 180 degrees is defined as $\pi$.

pow(,)

Performs the standard pow() mathematical operation. The output value is always a floating-point number.

numberFormat(,)

Applies the number format in the first value to the second value.

The first value can contain the following characters:

• # -- represents a numeric digit.
• , -- represents a comma separator in large numbers.
• . -- represents a decimal point.
icuText()

Converts the input date format string to a pattern that matches the expected locale format. If the parent PartText element includes a Localization element, that locale's format is used. Otherwise, uses th Wear OS device's current locale.

For example, if the device is being used in the United States, an input value of EE, MMM d, yyyy h:mm a yields the following output: Tue, Mar 14, 2023 1:59 PM

icuBestText()

Converts the input date format string to the current time whose pattern matches the expected format. If the parent PartText element includes a Localization element, that locale's format is used. Otherwise, uses the Wear OS device's current locale.

For example, if the device is being used in the United States on March 14, 2023 at 1:59 PM, an input value of yyyy MMM d EE a h:mm yields the following output: Tue, Mar 14, 2023, 1:59 PM

subText(,,)

Extracts a substring from the first value. The second value indicates the 0-based index into the first value where the substring should begin. The third value indicates the 0-based index into the first value where substring extraction should stop ("from the second value up to, but not including, the third value").

Examples:

• subText("abc def", 2, 5) is c d
• subText("abc def", 2, 7) is c def
textLength()

Calculates the length of the input string.

## Operators

The Watch Face Format recognizes the following string values as operators:

+
Unary plus, or addition of multiple values. Supports both integers and floating-point values.
-
Unary minus, or subtraction of multiple values. Supports both integers and floating-point values.
*
Multiplication of multiple integer or floating-point values.
/

Division of 2 integer or floating-point values.

If division of 2 integers results in a non-integer value, the decimal part is preserved in the floating-point result. For example, $\frac{1}{2} = 0.5$.

In addition, the expression $\frac{x}{0}$ is evaluated as 0, where $x$ is any integer.

%

Modular division of 2 integer or floating-point values.

If both operands are integers, the result is the remainder from dividing the 2 values. For example, $19 \bmod 7 = 5$.

If at least one operand is a floating-point number, the result is a floating-point equivalent of the remainder; for example: $19.0 \bmod 7 = 5.0$.

~

Bitwise "not" operator. Several examples:

• ~1 is $-2$
• ~0 is $-1$
!

Logical "not" operator, which supports double negatives. Several examples:

• $!2$ is false
• $!!0$ is true
|

Bitwise "or" operator. Supports more than 2 input values. Several examples:

• $1 | 0 = 1$
• $1 | 2 | 4 = 7$
||
Logical "or" operator.
&
Bitwise "and" operator. Supports exactly 2 input values.
&&
Logical "and" operator.
(
Open parenthesis. Used for changing the standard order of operations, where multiplication and division ordinarily take priority over addition and subtraction.
)
Closed parenthesis. Used for changing the standard order of operations, where multiplication and division ordinarily take priority over addition and subtraction.
<
The "less than" comparison operator. When comparing an integer value with its floating-point equivalent, the result is false.
<=
The "less than or equal to" comparison operator. When comparing an integer value with its floating-point equivalent, the result is true.
>
The "greater than" comparison operator. When comparing an integer value with its floating-point equivalent, the result is false.
>=
The "greater than or equal to" comparison operator. When comparing an integer value with its floating-point equivalent, the result is true.
? and :

Provides support for ternary operations. The general format is as follows:

condition ? value_if_true : value_if_false


Supports nested ternary operations using parentheses.

,

Separates values in functions that take more than 1 argument.

"

When placed at the beginning and end of a value, indicates that the Watch Face Format should interpret the value as a string.

==

Compare for equality. When comparing an integer value with its floating-point equivalent, the result is true.

!=

Compare for inequality. When comparing an integer value with its floating-point equivalent, the result is false.

[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Missing the information I need" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Too complicated / too many steps" },{ "type": "thumb-down", "id": "outOfDate", "label":"Out of date" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Samples / code issue" },{ "type": "thumb-down", "id": "otherDown", "label":"Other" }]
[{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Easy to understand" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Solved my problem" },{ "type": "thumb-up", "id": "otherUp", "label":"Other" }]