Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение числа к нужному формату 
:(
    Опции темы
evilice
  Дата 27.11.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Проблема заключается в следующем:
В xml лежит число вида х.хххххE8 (пример: 1.33946E8)

на выходе я должен получить нормальное число вида ххх... (т.е., если исходить из выше упомянутого примера, я должен получить число: 133946000)

как средствами xsl это можно сделать?
PM MAIL   Вверх
sir_nuf_nuf
Дата 27.11.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 5
Всего: 31



evilice, на сайте W3C все написано
читайте! =)


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
evilice
  Дата 28.11.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



в том-то и дело, что 
format-number(number, string, string?)
а число 1.234678E7 представляется, как string!

и попытка его привести к number, оканчивается еррором!
т.е. format-number(1.23442E6, '#.0') на выходе имеет NaN...

Код

<xsl:value-of select="format-number(number($yzel/*[local-name()='CostContract']), '#.0')" />

или
Код

<xsl:value-of select="format-number($yzel/*[local-name()='CostContract'], '#.0')" />

что однофигственно!

ну раз силами стандартных методов это сделать нельзя... придётся извращаться и парсить...
PM MAIL   Вверх
sir_nuf_nuf
Дата 28.11.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 5
Всего: 31



Цитата(evilice @  28.11.2008,  10:03 Найти цитируемый пост)
т.е. format-number(1.23442E6, '#.0') на выходе имеет NaN...
 да ладно. все работает нормально.
проверьте сами на http://xslt.sitesfree.com/.

Код

<?xml version="1.0"?>
<greeting>
  <a>
  <CostContract>333</CostContract>
  </a>
</greeting>


Код

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="1.0">
  <xsl:output method="html"/>

  <xsl:template match="/">
    <xsl:variable name="yzel" select="//a"/>
    <xsl:value-of select="format-number(number($yzel/*[local-name()='CostContract']), '#.0')" />
  </xsl:template>
</xsl:stylesheet>



Цитата(evilice @  28.11.2008,  10:03 Найти цитируемый пост)
а число 1.234678E7 представляется, как string!
 как число оно представляется.


проблема в следующем xpath:
Код

number($yzel/*[local-name()='CostContract'])


Добейтесь что бы:
<xsl:value-of select="number($yzel/*[local-name()='CostContract'])" />
выводило нормальное число.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
evilice
Дата 28.11.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 27.11.2008

Репутация: нет
Всего: нет



Цитата

Добейтесь что бы:
<xsl:value-of select="number($yzel/*[local-name()='CostContract'])" />
выводило нормальное число.

именно этого мне и нужно добиться...

вот часть кода xml файла:
Код

<BuildingYearCost>
     <Year>2008</Year>
     <CostYear>1.20146E8</CostYear>
</BuildingYearCost>


т.е. xsl, в любом случае получает на входе "1.20146E8"... и вот как раз xsl мне и должен помочь с выводом числа в нормальном виде...
а из-за того что в числе присутствует "Е", xsl воспринимает его как string -> format-number не отрабатывает должным образом...

в общем пока я тщетно искал стандартное решение, мне пришло в голову сделать все через, всем извесное, место... главное чтобы работало, пока не будет найдено, в полне адекватное и быстрое решение...

принцип решения проблемы заключается в следующим:
т.к. "1.20146E8" воспринимается как string, значит будем парсить!
1) бьём строку на две части "до Е" и "после Е", назовём их "а" и "b"
2) приводим обе части к number
3) с помощью рекурсии умножаем "а" на 10 "b" раз
4) округляем полученное число до целого, но это конкретно для моей задачи(у меня не может быть дробных).
   можно и под себя настроить округление(по желанию)
PM MAIL   Вверх
sir_nuf_nuf
  Дата 28.11.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 5
Всего: 31



evilice, да не воспринимается он как string! точно!
вы просто xpath не правильно написали.
сделайте простой пример и посмотрите:
<xsl:value-of select="format-number('1.20146E8', '#')"/>
все работает.

ваша проблема в том, что
<xsl:value-of select="number($yzel/*[local-name()='CostContract'])" />
у вас ваще ничего не выводит, никаких данных! либо не те.  
format-number не при чем.


Вот пример где все работает.
Код

<?xml version="1.0"?>
<greeting>  
  <BuildingYearCost>
     <Year>2008</Year>
     <CostYear>1.20146E8</CostYear>
  </BuildingYearCost>
</greeting>


Код

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="1.0">
  <xsl:output method="html"/>

  <xsl:template match="/">
    <xsl:apply-templates select="//BuildingYearCost"/>
  </xsl:template>
  
  <xsl:template match="BuildingYearCost">
     <xsl:value-of select="format-number(./CostYear/text(), '#')"/>
  </xsl:template>
</xsl:stylesheet>


Учите XPath! smile 


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.