---
url: https://docs.juniper.bot/message-templates/types/type-convert.md
description: Конвертация типов данных шаблонного движка JuniperBot
---

# Конвертация типов

Шаблонный движок будет пытаться автоматически конвертировать значения определённых типов данных, если они не соответствуют требуемому типу.

## Правила конвертации { #rules }

Для некоторых типов данных происходит автоматическое конвертирование значений, которое следует следующим правилам:

### Числа { #numbers }

Там, где ожидается [число](index#literals), значения других типов данных могут быть сконвертированы следующим образом:

| Исходный тип               | Представление числа                          |
|:---------------------------|:---------------------------------------------|
| Нулевая ссылка (`null`)    | 0                                            |
| Неопределенный             | 0                                            |
| Логический                 | 1 если `true`, 0 если `false`                |
| Строка                     | Будет попытка распознать число в этой строке |
| [DateTime](index#datetime) | Преобразуется во временную метку (Timestamp) |

### Логический { #boolean }

Там, где ожидается [логическое значение](index#literals), значения других типов данных могут быть сконвертированы следующим образом:

| Исходный тип            | Логическое представление                 |
|:------------------------|:-----------------------------------------|
| Нулевая ссылка (`null`) | `false`                                  |
| Неопределенный          | `false`                                  |
| Строка                  | `false` если строка пустая, иначе `true` |
| Список или Карта        | `false` если пусты, иначе `true`         |
| Число                   | `false` если 0, иначе `true`             |

### Строка { #string }

Там, где ожидается [строка](index#literals), значение любого типа данных будет просто сконвертировано в строку так, как
это происходит при его [выводе](../advanced/code-islands#output).

### Дата и время { #datetime }

Там, где ожидается [DateTime](index#datetime), значения других типов данных могут быть сконвертированы следующим образом:

| Исходный тип | Представление даты                                                                                                                                                                                    |
|:-------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Строка       | Преобразование из формата [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601): `yyyy-MM-dd'T'HH:mm:ss.SSSZ`Если строка является `now`, будет создан экземпляр текущей даты. |
| Число        | Преобразует в дату, используя число как временная метку (Unix timestamp)                                                                                                                              |

## Где это работает? { #scope }

Автоматическая конвертация типов данных работает:

* В [операторах и выражениях](../advanced/expressions);
* В [конструкциях `if`](../advanced/tags#if);
* В аргументах [функций](../advanced/functions);
* В параметрах [методов](index), с некоторыми исключениями и особенностями.

::: tip Конвертация в параметрах методов

* Не работает для некоторых методов [списков](index#lists-methods) и [карт](index#maps-methods);
* В случае, если в документации у параметра метода указано несколько типов данных (т.н. перегрузок), шаблонный движок будет
  пытаться конвертировать входящее значение в указанном там порядке.
  :::

### Операции сравнения { #comparison }

В [бинарных операциях сравнения](../advanced/expressions#binary) (`>`, `>=`, `<`, `<=`, `in`, `==`, `!=`), шаблонный
движок следует следующему алгоритму:

1. Если оба операнда могут быть конвертированы в [число](#numbers), то конвертируются и сравниваются как числа;
2. Если хотя бы один из операндов не может быть конвертирован в число, то оба операнда конвертируются в строки и сравниваются как строки.

Этот алгоритм универсален, но в некоторых случаях следует учитывать порядок вычисления операций. Например:

```template
{{ 'true' == 1 == true }}
{{ true == 1 == 'true' }}
```

Казалось бы, оба выражения должны распечатать `true`, однако первый из них распечатает `false`.

В первом выражении:

1. `'true' == 1` вычисляется как `false`, потому что **строка** `'true'` не может быть конвертирована в [число](#numbers) и оба выражения сравниваются как строки `'true'` и `'1'`, что в результате даёт `false`;
2. Вторая операция сравнения теперь выглядит как `false == true`, что в результате даёт `false` как результат вычисления всего выражения целиком.

Во втором выражении:

1. `true == 1` вычисляется как `true`, потому что **логический** `true` может быть преобразован в число 1, и оба операнда сравниваются как числа (они равны);
2. Вторая операция сравнения теперь выглядит как `true == 'true'`, что в результате даёт `true`, но только лишь потому,
   что второй операнд `'true'` — **строка**, которая не может быть преобразована в число, поэтому первый операнд тоже конвертируется в строку и они сравниваются как строки (они равны).
