繁体   English   中英

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

[英]Convert string in scientific notation to number format in XPath

我有这个字符串:

8.1161E-002

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

那么我怎么能把这个String转换成像00.081这样的格式呢?

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

XPath 1.0解决方案

如果你坚持使用XPath 1.0并且你的输入是形式( 尾数 E + 指数 )或( 尾数 E- 指数 )你可以使用这个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. 如果指数的绝对值大于15,它将显示不正确的结果。
  3. 如果您有十六进制值,它也将失败(因为任何a将从最终结果中删除)。

将其应用于此文件:

<number>2.34</number>

它将正常读取为:

2.34

2.34e+5将被解读为2340002.34E-005将成为0.0000234

您可以使用函数编号()。 这适用于xpath 2.0。

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

XML

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

Xpath的

/this/number(stuff)

结果

0.081161

希望这可以帮助!

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

XS:十进制(总和(/ A / B))

工作正常

如果它有所帮助, 绍尔的解决方案已经解决了我的问题。 下面一行返回3.00375e2。 使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM