Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Приведение числа к нужному формату


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

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

как средствами xsl это можно сделать?

Автор: sir_nuf_nuf 27.11.2008, 17:57
evilice, http://www.w3schools.com/XSL/func_formatnumber.asp
читайте! =)

Автор: evilice 28.11.2008, 10:03
в том-то и дело, что 
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')" />

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

ну раз силами стандартных методов это сделать нельзя... придётся извращаться и парсить...

Автор: sir_nuf_nuf 28.11.2008, 10:40
Цитата(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'])" />
выводило нормальное число.

Автор: evilice 28.11.2008, 12:47
Цитата

Добейтесь что бы:
<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) округляем полученное число до целого, но это конкретно для моей задачи(у меня не может быть дробных).
   можно и под себя настроить округление(по желанию)

Автор: sir_nuf_nuf 28.11.2008, 14:52
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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)