我有一个带有十进制值的大型XML字符串,采用常规和科学记数法。我需要一种方法将所有指数值转换为常规符号。
到目前为止,我已经整理了以下Regex,它抓住指数数字的每个实例。
/-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/
我可以使用以下方法将这些转换为常规表示法:
Number('1.255262969126037e-14').toFixed();
现在我该如何把它们放在一起; 如何使用常规符号找到并替换所有出现的科学记数值?
考虑以下输入:
<path class="arc" d="M1.3807892660386408e-14,-225.50000000000003A225.50000000000003,225.50000000000003 0 0,1 219.47657188958337,51.77146310079094L199.52415626325757,47.06496645526448A205,205 0 0,0 1.255262969126037e-14,-205Z">
我需要以下输出:
<path class="arc" d="M0,-225.50000000000003A225.50000000000003,225.50000000000003 0 0,1 219.47657188958337,51.77146310079094L199.52415626325757,47.06496645526448A205,205 0 0,0 0,-205Z">
答案 0 :(得分:3)
String.prototype.replace
不仅接受替换字符串,还接受替换函数:
您可以将函数指定为第二个参数。在这种情况下, 在执行匹配后将调用函数。该 函数的结果(返回值)将用作替换 字符串。
要将所有科学记数法值转换为正常记法:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="pi" match="root/node()"
use="generate-id(preceding-sibling::processing-instruction()
[self::processing-instruction('start') or self::processing-instruction('end') ][1])"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="processing-instruction('start') |
processing-instruction('end') |
key('pi', '')"/>
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction('start')">
<group>
<xsl:apply-templates
select="key('pi', generate-id())
[not(self::processing-instruction('end'))]" />
</group>
</xsl:template>
<xsl:template match="processing-instruction('end')">
<xsl:apply-templates
select="key('pi', generate-id())[not(self::processing-instruction('start'))]" />
</xsl:template>
</xsl:stylesheet>
将所有浮点数(科学或正常)截断为整数:
input.replace(/-?\d+(\.\d*)?(?:[eE][+\-]?\d+)?/g, function(match, $1) {
// Count the number of digits after `.`,
// then -1 to delete the last digit,
// allowing the value to be rendered in normal notation
var prec = $1 ? $1.length - 1 : 0;
// Return the number in normal notation
return Number(match).toFixed(prec);
})
// => <path class="arc" d="M0.0000000000000138,-225.50000000000003A225.50000000000003,225.50000000000003 0 0,1 219.47657188958337,51.77146310079094L199.52415626325757,47.06496645526448A205,205 0 0,0 0.000000000000013,-205Z">