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



我有这个字符串:

8.1161E-002

这个字符串实际上是一个计算的结果(不幸的是,结果被转换为字符串,我不能改变它)。

那么我怎么把这个字符串转换成00.081这样的格式呢?

我正在看XPath参考,但我找不到format()函数,例如。在XPath中是否有办法做到这一点?

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之前的字符串),然后通过移动由指数确定的位置数的一串零得到一个分数或10的幂,然后将其与尾数相乘。它分别处理正指数和负指数的情况。由于XPath中没有if,因此它将两个结果连接为字符串,并允许其中一个生成'NaN,稍后将删除。

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

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

e可以是大写也可以是小写。

限制:

  1. 如果没有 +
  2. ,那么将无法工作。
  3. 如果指数的绝对值大于15,将显示不正确的结果。
  4. 如果你有十六进制值,它也会失败(因为任何a将从最终结果中删除)。

应用到这个文件:

<number>2.34</number>

正常读作:

2.34

但是2.34e+5将被读取为234000, 2.34E-005将被读取为0.0000234

可以使用number()函数。这适用于xpath 2.0。

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

XML

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

/this/number(stuff)
结果

0.081161

希望这对你有帮助!

我在Xpath> 1.0上遇到过同样的问题。为了完整起见,我用:

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

没问题

如果有帮助的话,Sauer的解决方案已经解决了我的问题。下面的线又回来了3.00375 e2。加上xs:decimal,得到300.375。

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

如果你想限制小数的数目,你可以使用round函数,如下所示:

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

最新更新