发新话题
打印

10进制到16进制的转换,如何支持负数?

10进制到16进制的转换,如何支持负数?

参照英文
http://www.stylusstudio.com/xmldev/200109/post80240.html
代码如下:
复制内容到剪贴板
代码:
<xsl:template name="Dec2Hex">
<xsl:param name="number">0</xsl:param>
<xsl:variable name="low">
<xsl:value-of select="$number mod 16"/>
</xsl:variable>
<xsl:variable name="high">
<xsl:value-of select="floor($number div 16)"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$high > 0">
<xsl:call-template name="Dec2Hex">
<xsl:with-param name="number">
<xsl:value-of select="$high"/>
</xsl:with-param>
</xsl:call-template>  
</xsl:when>
<xsl:otherwise>
<xsl:text>0x</xsl:text>
</xsl:otherwise>
</xsl:choose>  
<xsl:choose>
<xsl:when test="$low < 10">
<xsl:value-of select="$low"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="temp">
<xsl:value-of select="$low - 10"/>
</xsl:variable>
<xsl:value-of select="translate($temp, '012345', 'ABCDEF')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
如何让这个过程支持负数,最大到0xFFFFFF,对应RGB颜色的定义。因为0x000000(黑色)可能表示为-16777216,0xFF0000(红色)可能表示为-65536
对于原码,反码,补码老搞不清楚,WEB中的颜色为3字节的16进制数。
变成负数是因为类型大小不够吧,short int 只有16位的

用long就能表示了吧,比如 0xff0000 == 16711680
Fluke's Blog
I'm a user.
终于搞掂。负数的补码是原码取反后+1,符号位我不去管他了,对付飞信的颜色正确有效。中间用到了一个 Martin Rowlinson (aka Marrow) 的库numberutils_lib.xsl,这个文件的代码可以在 http://www.topxml.com/code/default.asp?p=3&id=v20020307064151 取得。代码如下:
复制内容到剪贴板
代码:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--                   包含数字工具库                         -->
<xsl:include href="numberutils_lib.xsl"/>

<!-- ======================================================== -->
<!-- Function: Dec2Color(<DecValue>) => RGB Hex Color         -->
<!--           飞信十进制的颜色换成网页的RBG颜色              -->
<xsl:template name="Dec2Color">
    <xsl:param name="DecValue">0</xsl:param>
    <xsl:choose>
        <xsl:when test="$DecValue < 0">
            <xsl:variable name="temp">
                <xsl:call-template name="Dec2Hex">
                    <xsl:with-param name="value" select="number(-$DecValue)" />
                    <xsl:with-param name="digits" select="number(6)" />
                </xsl:call-template>
            </xsl:variable>
            <xsl:variable name="temp2">
                <xsl:value-of select="translate($temp, '0123456789ABCDEF', 'FEDCBA9876543210')" />
            </xsl:variable>
            <xsl:variable name="temp3">
                <xsl:call-template name="Hex2Dec">
                    <xsl:with-param name="value" select="$temp2" />
                </xsl:call-template>
            </xsl:variable>
            <xsl:variable name="temp4">
                <xsl:call-template name="Dec2Hex">
                    <xsl:with-param name="value" select="number($temp3 + 1)" />
                    <xsl:with-param name="digits" select="number(6)" />
                </xsl:call-template>
            </xsl:variable>
            <xsl:value-of select="concat('#',substring($temp4,string-length($temp4)-5,6))" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:variable name="temp">
                <xsl:call-template name="Dec2Hex">
                    <xsl:with-param name="value" select="number($DecValue)" />
                    <xsl:with-param name="digits" select="number(6)" />
                </xsl:call-template>
            </xsl:variable>
            <xsl:value-of select="concat('#',substring($temp,string-length($temp)-5,6))" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>
-1 得到 #FFFFFF,-16777216 得到 #000000,正确!
我郁闷了理解有些困难
发新话题