在科学记数法中将字符串转换为XPath中的数字格式

时间:2014-05-30 17:17:37

标签: xml xpath

我有这个字符串:

8.1161E-002

这个字符串实际上是计算的结果(遗憾的是结果被转换为字符串而我无法改变它。)

那么如何将此String转换为00.081

之类的格式

我正在查看XPath参考,但我找不到format()函数。有没有办法在XPath中执行此操作?

4 个答案:

答案 0 :(得分:5)

XPath 1.0解决方案

如果您遇到 XPath 1.0 ,并且输入的格式为(尾数 E + exponent )或者(尾数 E - exponent )你可以使用这个 hack (这不是很好但是得到了工作完成):

translate(
     concat(
           number(substring('100000000000000',1,number(substring-after(/number,'E+'))+1))*number(substring-before(/number,'E+')),
           number(concat(substring('0.00000000000000',1,number(substring-after(/number,'E-'))+1),'1'))*number(substring-before(/number,'E-')),
           number(substring('100000000000000',1,number(substring-after(/number,'e+'))+1))*number(substring-before(/number,'e+')),
           number(concat(substring('0.00000000000000',1,number(substring-after(/number,'e-'))+1),'1'))*number(substring-before(/number,'e-')),
           /number[not(contains(.,'E')) and not(contains(.,'e'))]
     ), 'Na', ''
)

它提取尾数Ee之前的字符串),然后通过将一串零变换为位置由指数决定,然后将其与尾数相乘。它分别处理正或负指数的情况。由于XPath中没有 if ,它将两个结果连接成字符串,并允许其中一个产生'NaN,稍后将删除。

例如,如果 exponent +2,它将从第一个或第三个字符串中获取100子字符串。如果是+5,它将获得10000,如果是-3,它将从第二或第四个字符串中提取0.001子字符串。然后它会将该数字乘以尾数

由于您将拥有e+e-,其中一个将是字符串NaN,然后使用translate函数将其从最终字符串中删除(它删除所有Na字符,这些字符绝不会出现在十进制数字或科学记数法中)。最后一个concat参数用于处理科学记数法中的情况。

e 可以是大写或小写。

限制:

  1. 如果指数的绝对值大于15,则会显示不正确的结果。
  2. 如果您有十六进制值,它也会失败(因为任何+将从最终结果中删除。)
  3. 将其应用于此文件:

    a

    它将正常读取:

    <number>2.34</number>
    

    2.34 将被视为2.34e+5234000将被视为2.34E-005

答案 1 :(得分:1)

您可以使用功能编号()。这适用于xpath 2.0。

这是一个如何运作的例子。

XML

<this>
<stuff>8.1161E-002</stuff>
</this>

Xpath的

/this/number(stuff)

结果

0.081161

希望这有帮助!

答案 2 :(得分:1)

我在Xpath> 1.0上遇到了同样的问题。为了完整起见,我用以下方法解决了我的问题:

xs:decimal(sum(/ a / b))

工作正常

答案 3 :(得分:1)

如果有帮助,Sauer's solution已解决了我的问题。下面的行正在返回 3.00375e2。使用xs:decimal现在可以获得300.375。

/products/xs:decimal(avg(product[contains(name/text(),"Microprocessor")]/price))

如果要限制小数位数,可以使用舍入函数,如下所示:

/products/round(xs:decimal(avg(product[contains(name/text(),"Microprocessor")]/price))*100) div 100