Логика не работает должным образом в приведенных выше ответах Moop и user357812 при определении vFactor
в одном конкретном сценарии.
Если vExponent
- однозначное положительное число (без предшествующего знака «+»), то vFactor
устанавливается в пустую строку. Это потому, что было сделано предположение, что 1-й символ vExponent
будет знаком плюс / минус и, следовательно, 2-й символ будет интересен. Переменная vMantissa
затем умножается на пустую строку, в результате чего шаблон выводит NaN
.
Если vExponent
является многозначным положительным числом (без предшествующего знака «+»), тогда для vFactor
установлено неправильное значение. Из-за вышеупомянутого предположения 1-ая цифра игнорируется, а vMantissa
затем умножается на неверный vFactor
.
Поэтому я немного изменил ранее опубликованный код, чтобы он мог обрабатывать научные номера форм: 2E-4, 2E + 4 и 2E4.
<xsl:template name="convertSciToNumString" >
<xsl:param name="inputVal" select="0"/>
<xsl:variable name="vMantissa" select="substring-before(., 'E')"/>
<xsl:variable name="vExponent" select="substring-after(., 'E')"/>
<xsl:variable name="vExponentAbs" select="translate($vExponent, '-', '')"/>
<xsl:variable name="vFactor" select="substring('100000000000000000000000000000000000000000000', 1, substring($vExponentAbs, 1) + 1)"/>
<xsl:choose>
<xsl:when test="number($inputVal)=$inputVal">
<xsl:value-of select="$inputVal"/>
</xsl:when>
<xsl:when test="starts-with($vExponent,'-')">
<xsl:value-of select="format-number($vMantissa div $vFactor, '#0.#############')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number($vMantissa * $vFactor, '#0.#############')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>