результата не хватает 64-битной точности.
□ Особое значение NaN
, 'не-число' (англ. 'not-a-number'). Результат преобразования нечислового строкового значения в числовой формат.
Примеры особых значений:
-1 div 0
→
1 div 0
→
1 div (-1 div 0)
→
-1 div (1 div 0)
→
1 div (1 div 0)
→
-1 div (-1 div 0)
→
1-1
→
number('one')
→ NaN,
number('NaN')
→ NaN,
Все числовые значения, кроме NaN
являются упорядоченными, иначе говоря, для них определены операции сравнения.
□ Отрицательная бесконечность является наименьшим численным значением. Две отрицательные бесконечности равны между собой.
□ Отрицательные конечные числа больше отрицательной бесконечности, но меньше отрицательного нуля.
□ Отрицательный и положительный нули считаются равными.
□ Положительные конечные числа больше положительного нуля, но меньше положительной бесконечности.
□ Положительная бесконечность является наибольшим числом. Две положительные бесконечности находятся в равенстве, все остальные числа всегда будут меньше.
□ 1 div (1 div 0) < 1 div 0
→ true
(положительный нуль меньше положительной бесконечности);
□ 1 div 0 < 2 div 0
→ false
(положительный нуль равен другому положительному нулю);
□ -2 div 0 > -1 div 0 > false -1 div 0 = -2 div 0
→ true
(отрицательные бесконечности равны между собой);
□ -1 div 0 < -1
→ true
(отрицательная бесконечность меньше любого отрицательного числа);
□ -1 < -2 div (1 div 0)
→ true
(любое отрицательное число меньше отрицательного нуля);
□ -2 div (1 div 0) = 1-1
→ true
1 div (1 div 0) > -2 div (1 div 0)
→ false
(отрицательный нуль равен положительному нулю);
□ 1 > 1 div (1 div 0)
→ true
(любое положительное число превосходит положительный нуль).
Нечисловые значения, NaN
, являются неупорядоченными — это означает, что, сравнивая их с другими числами, нельзя установить — больше они, меньше или равны. Результат сравнений операторами '<
', '<=
', '=
', '>
', '>=
' будет 'ложью', если хотя бы одно из сравниваемых значений — NaN
. Единственное, что можно с точностью сказать о NaN
— это то, что они не равны никакому другому числу, включая, собственно, нечисловые значения. То есть, если хотя бы один из операндов — NaN
, результатом сравнения с использованием оператора '!=
' будет 'истина'. Это влечет за собой интересный способ проверки, является ли значение некоторой переменной нечисловым или нет: выражение $x!=$x
(буквально значение переменной x
не равно значению переменной x
) обратится в 'истину' в том и только том случае, если значением $x
является NaN
. В шаблонных правилах эта проверка может быть записана при помощи элемента xsl:if
:
<xsl:if test='$x != $x'>
<xsl:text>This is not a number (NaN).</xsl:text>
</xsl:if>
Арифметические операции в XSLT никогда не вызывают ошибки. Деление на нуль, не разрешенное во многих языках программирования, не является для XSLT исключительной ситуацией. Частным такого деления будет положительная или отрицательная бесконечность. Но все же, следует осторожно использовать 'опасные' выражения, например, в сравнениях. Несколько необычное поведение операторов сравнения в операциях с NaN может создать в программе курьезные, но трудно обнаруживаемые ошибки — можно легко забыть о том, что некоторые значения могут быть не равны сами себе.
Числа могут быть неявно преобразованы в булевый тип или в строку. При преобразовании числа в булевый тип, нуль (как положительный, так и отрицательный) и NaN
преобразуются в false
, все остальные значения (включая бесконечности) — в true
.
-1 div (1 div 0) > false 1 div 0
→ true
number('NaN') > false number('true')
→ false
Результатом неявного преобразования числа в строку является:
□ для конечных чисел — запись числа в десятичном формате;
□ для нулей (и положительного, и отрицательного) — '0
';
□ для бесконечностей (отрицательной и положительной) — '-Infinity
' и 'Infinity
' соответственно;
□ для нечисловых значений — 'NaN
'.
-14 div 3
→ '-4.666666666666667'
0010.00050000
→ '10.0005'
-1 div (1 div 0)
→ '0'
1 - 1
→ '0'
1 div 0
→ 'Infinity'
-2 div 0
→ '-Infinity'
number('NaN')
→ 'NaN'
number('Infinity')
→ 'NaN'
Кроме неявного преобразования в строку, XSLT предоставляет широкие возможности для форматирования числовых значений с использованием функции format-number
.
Строковый тип (string)
Строки в XSLT практически не отличаются от строк в других языках программирования. Строка — это последовательность, состоящая из нуля или более символов определенного алфавита или набора символов (англ. character set). XSLT использует в качестве алфавита Unicode, что теоретически позволяет