powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Не применяется функция форматирования чисел
11 сообщений из 11, страница 1 из 1
Не применяется функция форматирования чисел
    #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
Не применяется функция форматирования чисел
    #40029749
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чему равно ratesStr? И что вы ожидаете увидеть?
...
Рейтинг: 0 / 0
Не применяется функция форматирования чисел
    #40029771
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Чему равно ratesStr? И что вы ожидаете увидеть?


ratesStr = 7.00
Ожидаю увидеть 7
Вот тут https://xslttest.appspot.com/ форматируется так, как я ожидаю, то есть и 7 и 7.00 выводится как 7
...
Рейтинг: 0 / 0
Не применяется функция форматирования чисел
    #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
Не применяется функция форматирования чисел
    #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
Не применяется функция форматирования чисел
    #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
Не применяется функция форматирования чисел
    #40029876
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вижу что содержание ratesStr должно быть другое. Пока не смог его вывести.
...
Рейтинг: 0 / 0
Не применяется функция форматирования чисел
    #40030028
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XEugene
Да, вижу что содержание ratesStr должно быть другое


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


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


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


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