Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Не применяется функция форматирования чисел / 11 сообщений из 11, страница 1 из 1
21.12.2020, 13:43
    #40029727
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
Нужно, чтобы целое число выводилось без точки и нулей после неё.
Нужный формат я нашёл, во всяком случае тут https://xslttest.appspot.com/ он работает:
Код: xml
1.
format-number($number, '0.######') 



Но в реальном шаблоне не получается правильно применить format-number. 7 по-прежнему выводится как 7.00

Исходный шаблон такой
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
    <xsl:template name="processRatesStr">
        <xsl:param name="ratesStr"/>
        <xsl:choose>
            <xsl:when test="substring($ratesStr, 1, 1) = '='">
                <xsl:value-of select="substring($ratesStr,2,string-length(substring($ratesStr,2))-1)"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="nRates">
                    <xsl:choose>
                        <xsl:when test="$ratesStr = '|'">0</xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="substring(substring-before($ratesStr, '|'),2)"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <xsl:choose>
                    <xsl:when test="$nRates = '0'">
                        

                        От <xsl:text disable-output-escaping="yes">&#160;</xsl:text>
                        – до <xsl:text disable-output-escaping="yes">&#160;</xsl:text>
                        дней (включительно) - <xsl:text disable-output-escaping="yes">&#160;</xsl:text>
                        <xsl:text>.</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:call-template name="processRatesList">
                            <xsl:with-param name="currentVal">
                                <xsl:value-of select="substring-after($ratesStr, '|')"/>
                            </xsl:with-param>
                            <xsl:with-param name="ind"><xsl:value-of select="1"/></xsl:with-param>
                            <xsl:with-param name="count"><xsl:value-of select="$nRates"/></xsl:with-param>
                        </xsl:call-template>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>




Вот так я пытаюсь применить format-number
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
    <xsl:template name="processRatesStr">
        <xsl:param name="ratesStr"/>
        <xsl:choose>
            <xsl:when test="substring($ratesStr, 1, 1) = '='">
                <xsl:value-of select="format-number(substring($ratesStr,2,string-length(substring($ratesStr,2))-1), '0.######')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="nRates">
                    <xsl:choose>
                        <xsl:when test="$ratesStr = '|'">0</xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="format-number(substring(substring-before($ratesStr, '|'),2), '0.######')"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <xsl:choose>
                    <xsl:when test="$nRates = '0'">
                        

                        От <xsl:text disable-output-escaping="yes">&#160;</xsl:text>
                        – до <xsl:text disable-output-escaping="yes">&#160;</xsl:text>
                        дней (включительно) - <xsl:text disable-output-escaping="yes">&#160;</xsl:text>
                        <xsl:text>.</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:call-template name="processRatesList">
                            <xsl:with-param name="currentVal">
                                <xsl:value-of select="substring-after($ratesStr, '|')"/>
                            </xsl:with-param>
                            <xsl:with-param name="ind"><xsl:value-of select="1"/></xsl:with-param>
                            <xsl:with-param name="count"><xsl:value-of select="$nRates"/></xsl:with-param>
                        </xsl:call-template>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>




Что я не так делаю?
...
Рейтинг: 0 / 0
21.12.2020, 14:29
    #40029749
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
Чему равно ratesStr? И что вы ожидаете увидеть?
...
Рейтинг: 0 / 0
21.12.2020, 15:32
    #40029771
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
_Vasilisk_
Чему равно ratesStr? И что вы ожидаете увидеть?


ratesStr = 7.00
Ожидаю увидеть 7
Вот тут https://xslttest.appspot.com/ форматируется так, как я ожидаю, то есть и 7 и 7.00 выводится как 7
...
Рейтинг: 0 / 0
21.12.2020, 16:07
    #40029791
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
XEugene
ratesStr = 7.00
Для
Код: xml
1.
2.
3.
<xsl:call-template name="processRatesStr">
  <xsl:with-param name="ratesStr" select="'7.00'"/>
</xsl:call-template>

вызывается шаблон
Код: xml
1.
<xsl:call-template name="processRatesList">

неизвестного содержимого.

Если же ваш шаблон переписать так
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/a">
                        <xsl:call-template name="processRatesStr">
                            <xsl:with-param name="ratesStr" select="'7.00'"/>
                        </xsl:call-template>
    </xsl:template>

    <xsl:template name="processRatesStr">
        <xsl:param name="ratesStr"/>
        <xsl:choose>
            <xsl:when test="substring($ratesStr, 1, 1) = '='">
                <xsl:value-of select="format-number(substring($ratesStr,2,string-length(substring($ratesStr,2))-1), '0.######')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="nRates">
                    <xsl:choose>
                        <xsl:when test="$ratesStr = '|'">0</xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="format-number(substring(substring-before($ratesStr, '|'),2), '0.######')"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
               <xsl:value-of select="$nRates"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

То получим NaN. Потому что
Код: xml
1.
substring-before($ratesStr, '|')

вернет пустую строку
...
Рейтинг: 0 / 0
21.12.2020, 16:38
    #40029806
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
_Vasilisk_
Для
Код: xml
1.
2.
3.
<xsl:call-template name="processRatesStr">
  <xsl:with-param name="ratesStr" select="'7.00'"/>
</xsl:call-template>

вызывается шаблон
Код: xml
1.
<xsl:call-template name="processRatesList">

неизвестного содержимого.



processRatesList выглядит так. Там уже другой текст выводится, после того числа, которое нужно отформатировать.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
    <xsl:template name="processRatesList">
        <xsl:param name="currentVal"/>
        <xsl:param name="ind"/>
        <xsl:param name="count"/>
        <xsl:variable name="oneRate">
            <xsl:value-of select="substring-before($currentVal, '|')"/>
        </xsl:variable>
        <xsl:if test="not(number($ind) > number($count))">
            

            От
            <xsl:value-of select="substring-before($oneRate,':')"/>
            – до
            <xsl:value-of select="substring-before(substring-after($oneRate,':'), '=')"/>
            дней (включительно) -
            <xsl:value-of select="substring-after($oneRate,'=')" />
            <xsl:choose>
                <xsl:when test="number($ind) &lt; number($count)">
                    <xsl:text>;</xsl:text>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:text>.</xsl:text>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:call-template name="processRatesList">
                <xsl:with-param name="currentVal"><xsl:value-of select="substring-after($currentVal, '|')"/></xsl:with-param>
                <xsl:with-param name="ind"><xsl:value-of select="number($ind) + 1"/></xsl:with-param>
                <xsl:with-param name="count"><xsl:value-of select="$count"/></xsl:with-param>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
...
Рейтинг: 0 / 0
21.12.2020, 17:41
    #40029852
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
XEugene
processRatesList выглядит так.
Еще раз, для
_Vasilisk_
Код: xml
1.
2.
3.
<xsl:call-template name="processRatesStr">
  <xsl:with-param name="ratesStr" select="'7.00'"/>
</xsl:call-template>

nRates будет равно NaN
_Vasilisk_
Потому что
Код: xml
1.
substring-before($ratesStr, '|')


вернет пустую строку
Давайте реальное значение ratesStr
...
Рейтинг: 0 / 0
21.12.2020, 18:50
    #40029876
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
Да, вижу что содержание ratesStr должно быть другое. Пока не смог его вывести.
...
Рейтинг: 0 / 0
22.12.2020, 09:24
    #40030028
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
XEugene
Да, вижу что содержание ratesStr должно быть другое


Там вот такое:
3|01 июня 2012|11454198656.00 (Одиннадцать миллиардов четыреста пятьдесят четыре миллиона сто девяносто восемь тысяч шестьсот пятьдесят шесть рублей 00 копеек)|12 (Двенадцать)|


И 11454198656.00 это число, которое нужно отформатировать.
...
Рейтинг: 0 / 0
22.12.2020, 09:40
    #40030032
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
то есть 12


то есть из <xsl:value-of select="$percentRate" />
которое представляет собой 12 (Двенадцать)
нужно выделить число 12 и к нему применить форматирование.
...
Рейтинг: 0 / 0
22.12.2020, 10:25
    #40030047
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
Должно работать так
Код: xml
1.
<xsl:value-of select="format-number(substring-before($percentRate, '('), '0.######')" />
...
Рейтинг: 0 / 0
22.12.2020, 11:10
    #40030057
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не применяется функция форматирования чисел
Да, так работает.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Не применяется функция форматирования чисел / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]