Форматирование чисел в XSLT

Задача: написать шаблон для форматирования чисел в разных локалях

Для форматирования чисел в XSLT существует стандартная функция format-number(number, format, decimal-format). Эта функция форматирует число таким образом, что вставляет разделитель тысяч и обрезает число десятичных знаков. Но у неё есть один баг: вставка разделителя тысяч осуществляется даже тогда, когда число содержит всего 4 знака, т.е меньше 10 тысяч, а согласно стандарту это делать не нужно. Если у вас многоязычный сайт, то форматирование чисел для разных локалей должно быть разным.

Привожу пример решения задачи в виде одного XSLT-шаблона: <!-- Определяем формат decimal-format, который контролирует интерпретацию шаблона формата функцией format-number (третий аргумент) --> <xsl:decimal-format decimal-separator='.' grouping-separator=',' name="en" /> <xsl:decimal-format decimal-separator=',' grouping-separator=' ' name="ru" /> <!-- Шаблон для форматирования чисел можно использовать для xsl:apply-templates и xsl:call-template с указанием нужной ноды или числа в xsl:with-param --> <xsl:template match="*" mode="format-number" name="format-number"> <xsl:param name="n" select="." /> <xsl:param name="lang" select="'ru'" /> <xsl:variable name="tousands"> <xsl:choose> <xsl:when test="$lang = 'en'"><xsl:text>,</xsl:text></xsl:when> <xsl:when test="$lang = 'ru'"><xsl:text> </xsl:text></xsl:when> <xsl:otherwise><xsl:text>,</xsl:text></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="decimals"> <xsl:choose> <xsl:when test="$lang = 'en'"><xsl:text>.</xsl:text></xsl:when> <xsl:when test="$lang = 'ru'"><xsl:text>,</xsl:text></xsl:when> <xsl:otherwise><xsl:text>.</xsl:text></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="format" select="concat('###', $tousands, '##0', $decimals, '00')" /> <xsl:variable name="number"> <xsl:choose> <xsl:when test="$lang"> <xsl:value-of select="format-number($n, $format, $lang)" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="format-number($n, $format)" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="result"> <xsl:choose> <!-- Удаляем ненужный разделитель тысяч, если число четырехзначное --> <xsl:when test="string-length(floor(translate($n,'-',''))) = 4"> <xsl:value-of select="concat( substring-before($number, $tousands), substring-after($number, $tousands) )" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="$number" /> </xsl:otherwise> </xsl:choose> </xsl:variable> <span class="number nobr"> <xsl:value-of select="$result" /> </span> </xsl:template>
22.04.2011 / xslt
Понравилась статья?
Подпишись на рассылку через RSS или следуй за нами в Twitter!
Похожие статьи:
Оценка статьи: проголосовало - 0, средняя оценка - 0
Комментарии к статье (0): Добавить комментарий
АНТИСПАМ: Выберите улыбающийся смайл: yep! nope! nope!
Оформление заявки
Файл>>