用常规数字替换所有出现的科学数字

时间:2016-03-19 12:17:01

标签: javascript regex math numbers

我有一个带有十进制值的大型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">

1 个答案:

答案 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,20‌​5 0 0,0 0.000000000000013,-205Z">