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

D. *_*aan 6 xml xpath

我有这个字符串:

8.1161E-002
Run Code Online (Sandbox Code Playgroud)

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

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

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

hel*_*cha 5

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', ''
)
Run Code Online (Sandbox Code Playgroud)

它提取尾数(在E或之前的字符串e),然后通过将一串零点移动由指数确定的位置数量来获得10的分数或幂,然后将其与尾数相乘.它分别处理正或负指数的情况.由于在XPath中没有if,它将两个结果连接成字符串,并允许其中一个产生'NaN,稍后将删除.

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

因为你要么有e+或者e-,其中一个将是NaN使用该translate函数从最终字符串中删除的字符串(它删除所有N和a字符,它们从不以十进制数字或科学记数法出现).最后一个concat论点涉及数字不是科学记数法的情况.

所述ê可以在上或下壳体.

限制:

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

将其应用于此文件:

<number>2.34</number>
Run Code Online (Sandbox Code Playgroud)

它将正常读取为:

2.34
Run Code Online (Sandbox Code Playgroud)

但是,2.34e+5将被解读为234000和2.34E-005会变得0.0000234.