> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arc.cdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 数値フォーマッタ

> ArcScript で数値の算術演算、数値比較、丸め、フォーマットを行うためのフォーマッタ。

export const siteNameShort = "Arc";

## 一般的な数値フォーマッタ

以下のフォーマッタは、最も一般的な数値フォーマッタです。参考までに各フォーマッタの例を提供しています。

<Note>一部のフォーマッタのオプションパラメータを囲う角括弧は、必須ではありません。これらは、パラメータがオプションであることを示すためにあります。</Note>

### add(value)

入力属性 / 値を *value* パラメータに追加し、結果を返します。デフォルト値は`1` です。

#### 例

```xml theme={null}
<!-- count the number of loops in an XML document using xmlDOMSearch -->

<arc:set attr="xml.uri" value="[FilePath]" />
<arc:set attr="xml.xpath" value="/Items/test/loop" />

<arc:call op="xmlDOMSearch" in="xml">
  <!-- this code executes for each occurrence of the 'xpath' in the XML document -->
  <arc:set attr="loopCount" value="[loopCount | def(0) | add(1)]" />
</arc:call>
```

### greaterthan(value\[, ifgreater]\[, ifnotgreater])

入力属性 / 値が *value* パラメータより大きい場合は *true* を返し、それ以外の場合は *false* を返します。

*ifgreater* が指定されている場合は、 *true* の代わりにその値が返され（入力が *value* より大きい場合）、 *ifnotgreater* が指定されている場合は、 *false* の代わりにその値が返されます（入力が *value* より大きくない場合）。

#### 例

```xml theme={null}
<arc:set attr="totalCost" value="[xpath(Items/Order/TotalCost)]" />
<arc:if exp="[totalCost | greaterthan(1000)]">
  <arc:set attr="highValueOrder" value="true" />
</arc:if>
```

### lessthan(value\[, ifless]\[, ifnotless])

入力属性 / 値が *value* パラメータより小さい場合は *true* を返し、それ以外の場合は *false* を返します。

*ifless* が指定されている場合は、 *true* の代わりにその値が返され（入力が *value* より小さい場合）、 *ifnotless* が指定されている場合は、 *false* の代わりにその値が返されます（入力が *value* より小さくない場合）。

#### 例

```xml theme={null}
<arc:set attr="totalCost" value="[xpath(Items/Order/TotalCost)]" />
<arc:if exp="[totalCost | lessthan(0)]">
  <arc:throw code="1" desc="ERROR: Invalid order total." />
</arc:if>
```

### multiply(value)

入力属性 / 値と *value* パラメータを乗算し、結果を返します。

#### 例

```xml theme={null}
<!-- find the total cost by multiplying the price and the quantity of a purchased item -->
<arc:set attr="item.price" value="[xpath(lineitem/costperunit)]" />
<arc:set attr="item.quantity" value="[xpath(lineitem/quantitypurchased)]" />
<arc:set attr="item.totalcost" value="[item.price | multiply([item.quantity])]" />
```

### rand(upperBound)

0 と *upperBound* の間のランダムな整数を生成します。

このフォーマッタは入力属性（変数）を変更しないため、入力属性は必要ありません。

#### 例

```xml theme={null}
<!-- add a random number to the end of a filename -->
<arc:set attr="myFilename" value="myfile-[rand(100000)].xml" />
```

## その他の数値フォーマッタ

次のフォーマッタは、前のセクションで説明したものよりも一般的ではありません。

### abs()

数値属性値の絶対値を返します。

### and(value)

2つの値のAND を返します。両側の値は、1/0、yes/no、true/false である必要があります。

* **value**：比較するboolean 値。

### ceiling()

数値属性値以上で最小の整数を返します。

### currency(\[integer\_count])

通貨としてフォーマットされた数値を返します。

* **count**：小数点以下の表示桁数を指定する数値（オプション）。デフォルトは`2` です。

### decimal(\[integer\_count])

10進数としてフォーマットされた数値を、千、百万、などをカンマで区切って返します。

* **count**：小数点以下の表示桁数を指定する数値（オプション）。デフォルトは`2` です。

### div(\[value])

数値属性値をパラメータの指定された値で除算した結果を返します。

* **value**：数値属性値を除算する数値（オプション）。デフォルトは`2` です。

### divide(\[value])

数値属性値をパラメータの指定された値で除算した結果を返します。

* **value**：数値属性値を除算する数値（オプション）。デフォルトは`2` です。

### expr(expression)

自由形式の数式または論理式を評価し、その結果を返します。`lessthan()` や`isequal()` のような単一演算のフォーマッタとは異なり、`expr()` は標準的な比較演算子と論理演算子を直接受け入れるため、複合条件や複数変数の比較に適した方法となります。

* **expression**：自由形式の式。

#### サポートされる演算子

| 演算子    | 説明     |
| ------ | ------ |
| `+`    | 加算     |
| `-`    | 減算     |
| `*`    | 乗算     |
| `/`    | 除算     |
| `%`    | 剰余（余り） |
| `<`    | より小さい  |
| `<=`   | 以下     |
| `>`    | より大きい  |
| `>=`   | 以上     |
| `==`   | 等しい    |
| `!=`   | 等しくない  |
| `&&`   | 論理AND  |
| `\|\|` | 論理OR   |

#### 例

1. **`<=` チェックにおける、連結フォーマッタと`expr()` の同等のアプローチ**

   ```
   <!-- Using chained formatters -->
   [a | lessthan([b]) | or([a | equals([b])])]
   <!-- Using expr() -->
   [_ | expr("[a] <= [b]")]
   ```

   ```
   <arc:set attr="order.orderQty" value="5" />
   <arc:set attr="warehouse.stockLevel" value="10" />
   <arc:set attr="result.canFulfill" value="" />

   <arc:if exp="[_ | expr("[order.orderQty] <= [warehouse.stockLevel]")]">
     <arc:set attr="result.canFulfill" value="true" />
   <arc:else>
     <arc:set attr="result.canFulfill" value="false" />
   </arc:else>
   </arc:if>

   <arc:set attr="out.filename" value="order_fulfillment_result.txt" />
   <arc:set attr="out.data" value="canFulfill=[result.canFulfill]" />
   <arc:push item="out" />
   ```

   **想定される出力**

   `order_fulfillment_result.txt` という名前のファイルが`canFulfill=true` という内容で書き込まれ、送信メッセージヘッダー`X-Can-Fulfill` が`true` に設定されます。

2. **`>=` のチェック**

   ```
   <arc:set attr="data.score" value="85" />
   <arc:set attr="data.minimum" value="80" />
   <arc:set attr="data.target" value="85" />
   <arc:set attr="data.stretch" value="90" />
   <arc:set attr="_log.info" value="score >= minimum: [ | expr('[data.score] >= [data.minimum]')]" />
   <arc:set attr="_log.info" value=" score >= target: [ | expr('[data.score] >= [data.target]')]" />
   <arc:set attr="_log.info" value="score >= stretch: [ | expr('[data.score] >= [data.stretch]')]" />
   ```

   **想定される出力**

   * `score >= minimum: true`
   * `score >= target: true`
   * `score >= stretch: false`

3. **複数変数を用いた複合条件**

   ```
   <arc:set attr="item.price" value="49.99" />
   <arc:set attr="item.minPrice" value="10" />
   <arc:set attr="item.maxPrice" value="500" />
   <arc:set attr="item.priceValid" value="" />

   <arc:if exp="[_ | expr("[item.price] >= [item.minPrice] && [item.price] <= [item.maxPrice]")]">
     <arc:set attr="item.priceValid" value="true" />
   <arc:else>
     <arc:set attr="item.priceValid" value="false" />
   </arc:else>
   </arc:if>
   ```

   **想定される出力**

   `priceValid = true`

4. **XML 入力ファイルからの値の読み取り**

   Script コネクタが受信メッセージを処理する際、メッセージ本文は`[FilePath]` を介して利用できます。以下の例は、その入力を開き、`xpath()` を使って値を読み取り、それらの値を`expr()` で評価する方法を示しています。次の入力メッセージが与えられた場合：

   ```xml theme={null}
   <Order>
     <Quantity>5</Quantity>
     <StockLevel>10</StockLevel>
   </Order>
   ```

   このスクリプトはそれらの値を読み取り、注文を満たせるかどうかを評価します：

   ```
   <arc:set attr="order.orderQty" value="" />
   <arc:set attr="order.stockLevel" value="" />
   <arc:set attr="result.canFulfill" value="" />

   <arc:set attr="xml.uri" value="[FilePath]" />
   <arc:call op="xmlOpen" in="xml">
     <arc:set attr="order.orderQty" value="[xpath(Order/Quantity)]" />
     <arc:set attr="order.stockLevel" value="[xpath(Order/StockLevel)]" />
   </arc:call>

   <arc:if exp="[_ | expr("[order.orderQty] <= [order.stockLevel]")]">
     <arc:set attr="result.canFulfill" value="true" />
   <arc:else>
     <arc:set attr="result.canFulfill" value="false" />
   </arc:else>
   </arc:if>
   ```

   **想定される出力**

   `canFulfill = true`

<Note>算術演算子または数値比較演算子を使用する場合、式の中で参照される属性には数値が含まれている必要があります。数値以外の文字列は予期しない結果を生む可能性があります。</Note>

### floor()

指定された数値属性値以下で最大の整数を返します。

### format(pattern)

指定されたパターンとプラットフォームの動作に基づいて数値結果をフォーマットします。

* **pattern**：使用するフォーマットのパターン。

#### 例

```
<arc:set attr="tmp" value="$1,440.123" />
[tmp]
<br>
[tmp | format("#.##")]
```

`$1,440.123` に設定された`tmp` 属性は、`format("#.##")` フォーマッタを介して渡されます。結果は\*\*\$1440.12\*\* です。

```
<arc:set attr="rnd" value="1055.68" />
[rnd]
<br>
[rnd | format("#.#")]
```

`1055.68` に設定された`rnd` 属性は、`format("#.#")` フォーマッタを介して渡されます。結果は**1055.7** です。

### isbetween(integer\_lowvalue, integer\_highvalue\[, ifbetween]\[, ifnotbetween])

属性値が、1つ目のパラメータ値以上で2つ目のパラメータ値以下の場合は *true* （または *ifbetween* ）を返します。それ以外の場合は、 *false* （または *ifnotbetween* ）を返します。

* **lowvalue**：確認する範囲の下限。
* **highvalue**：確認する範囲の上限。
* **ifbetween**：属性値が1つ目のパラメータ値以上で、2つ目のパラメータ値以下の場合に返される値（オプション）。
* **ifnotbetween**：属性値が1つ目のパラメータ値以下、または2つ目のパラメータ値以上の場合に返される値（オプション）。

### isequal(value\[, ifequal]\[, ifnotequal])

属性値がパラメータ値と等しい場合は *true* （または *ifequal* ）を返します。それ以外の場合は、 *false* （または *ifnotequal* ）を返します。

* **value**：属性値と比較する数値。
* **ifequal**：属性値がパラメータ値と等しい場合に返される値（オプション）。
* **ifnotequal**：属性値がパラメータ値と等しくない場合に返される値（オプション）。

### modulus(value)

数値属性値を指定されたパラメータ値で除算したモジュラスを返します。

* **value**：属性値を除算する数値。

### number(value\[, format]\[, locale])

10進数としてフォーマットされた数値を返します。フォーマットとロケールを追加するオプションを提供します。

* **format**：10進数形式（オプション）。デフォルトは`#.00` です。次の特殊文字を使用できます：

  | 文字  | 説明           |
  | --- | ------------ |
  | `0` | 桁            |
  | `#` | 桁。0 は不在を示します |
  | `.` | 小数点または通貨小数点  |
  | `-` | マイナス記号       |
  | `,` | グループセパレータ    |

* **locale**：ロケール情報。デフォルトは不変のカルチャまたはロケールです。つまり、特定の国または地域には関連付けられていません。言語タグ（例えば、`en`、`fr`、`en-US`、`en-IN`、`fr-FR`、`zh-CN` など）を許容します。

### or(value)

2つの値のOR を返します。両側の値は、1/0、yes/no、true/false である必要があります。

* **value**：比較するboolean 値。

### percentage(\[integer\_count])

パーセンテージとしてフォーマットされた数値を返します。

* **count**：小数点以下の表示桁数を示す数値（オプション）。

### pow(\[value])

パラメータ値で指定された指数で累乗された数値属性値を返します。

* **value**：属性値を引き上げる指数（オプション）。デフォルトは`2` です。

### round(\[integer\_value])

パラメータで指定された小数点以下の桁数に丸められた数値属性値を返します。

* **value**：小数点以下の桁数（オプション）。デフォルトは`2` です。
* **rounding\_mode**：精度を破棄できる数値演算の丸め処理の動作を指定します。許容される値は`Default`、`ToEven`、`AwayFromZero`、`ToZero`、`ToNegativeInfinity`、`ToPositiveInfinity` です。デフォルトで使用される丸め戦略は、オペレーティングシステムによって異なります。.NET では<a href="https://learn.microsoft.com/ja-jp/dotnet/api/system.midpointrounding?view=net-6.0" target="_blank">ToEven</a> を使用し、Java では<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/RoundingMode.html#HALF_EVEN" target="_blank">Half Even</a> を使用します。

また、`RoundingMode` グローバル環境変数を指定し、その値として`rounding_mode` の値のいずれかを指定することもできます。これを行うと、フォーマッタで`rounding_mode` が明示的に指定されていない場合、{siteNameShort} は常にその丸めモードを使用します。具体的には、{siteNameShort} は以下の順序で値をチェックします：

1. `rounding_mode` 入力
2. `RoundingMode` 環境変数
3. 前述したとおりのオペレーティングシステムによって決定されるデフォルト

### sqrt()

数値属性値の平方根を返します。

### subtract(\[value])

数値属性値とパラメータで指定された値の差を返します。

* **value**：属性値を減算する数値（オプション）。デフォルト値は`1` です。
