c#string.format和xslt数字格式的数字格式

时间:2015-11-12 10:36:09

标签: c# xml xslt internationalization tostring

我读了这些东西,例如:

但是xslt format-number和decimal-format的组合让我觉得我们指的是两次。

在c#中,ToString()string.Format()使用类似#,###.00类型的表示法。我喜欢的是逗号字符表示“组分隔符的位置”,点表示“小数分隔符的位置”。因此,如果我在法国文化中,我仍然使用逗号来表示组分隔符,但在格式化时它被[space]替换。所有这些变化都是文化。我可以全局设置。我不必更改字符串格式。

    double testNumber = 1500.99;

    CultureInfo usCulture = new CultureInfo("en-US"); //Decimal separator = . Group separator = ,
    CultureInfo frCulture = new CultureInfo("fr-FR"); //Decimal separator = , Group separator = [space]
    CultureInfo deCulture = new CultureInfo("de-DE"); //Decimal separator = , Group separator = .

    Debug.WriteLine( testNumber.ToString("#,###.00", CultureInfo.InvariantCulture) ); //output: 1,500.99
    Debug.WriteLine( testNumber.ToString("#,###.00", usCulture) ); //output: 1,500.99
    Debug.WriteLine( testNumber.ToString("#,###.00", frCulture) ); //output: 1 500,99
    Debug.WriteLine( testNumber.ToString("#,###.00", deCulture) ); //output: 1.500,99

在XSLT中,format-number似乎不同。最初我认为十进制格式相当于C#中的CultureInfo。但是如果你在那里指定法语或德语,那么必须改变字符串格式以反映它。因此,要更改xslt中的输出,我必须更改所有出现的字符串格式,并更改小数格式。我可以通过省略name属性来使用默认的十进制格式,这很好。但是如果我在转换中有100个数字,我必须更改100个字符串格式以匹配最终用户的语言环境。

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-16" indent="yes"/>

    <xsl:decimal-format name="usd" decimal-separator="." grouping-separator=","/>
    <xsl:decimal-format name="fr" decimal-separator="," grouping-separator=" "/>
    <xsl:decimal-format name="de" decimal-separator="," grouping-separator="."/>

    <xsl:param name="testNumber" select="1500.99"></xsl:param>
    <xsl:template match="/">
        <root>
            <DefaultVal>
                <xsl:value-of select="format-number($testNumber, '#,##0.00')"/>
                <!-- output: <DefaultVal>1,500.99</DefaultVal> -->
            </DefaultVal>
            <FrVal>
                <!-- <xsl:value-of select="format-number($testNumber, '#,##0.00', 'fr')"/> 
                Error: Format '#,##0.00' cannot have zero digit symbol after digit symbol after decimal point. -->
                <xsl:value-of select="format-number($testNumber, '# ##0,00', 'fr')"/>
                <!-- output: <FrVal>1 500,99</FrVal> -->
            </FrVal>
            <DeVal>
                <!-- <xsl:value-of select="format-number($testNumber, '#,##0.00', 'de')"/> -->
                <xsl:value-of select="format-number($testNumber, '#.##0,00', 'de')"/>
                <!-- output: <DeVal>1.500,99</DeVal> -->
            </DeVal>
        </root>
    </xsl:template>
</xsl:stylesheet>

在xml数据文件中使用“文化中立”的好方法是什么(数字看起来像1500.99)并使用xslt输出美国,法国或德国数字?

我是否必须创建命名参数并在格式编号中使用它?它有效,但看起来有点笨拙。

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-16" indent="yes"/>

    <!-- These 6 lines are global settings/definitions -->
    <xsl:decimal-format name="us" decimal-separator="." grouping-separator=","/>
    <xsl:decimal-format name="fr" decimal-separator="," grouping-separator=" "/>
    <xsl:decimal-format name="de" decimal-separator="," grouping-separator="."/>

    <xsl:param name="us_double_2decimals" select="'#,##0.00'"></xsl:param>
    <xsl:param name="fr_double_2decimals" select="'# ##0,00'"></xsl:param>
    <xsl:param name="de_double_2decimals" select="'#.##0,00'"></xsl:param>

    <!-- These 2 variables set appropriately once per transform according to my end user -->
    <xsl:param name="decimal_format_name" select="'de'"></xsl:param>
    <xsl:param name="double_2decimals" select="$de_double_2decimals"></xsl:param>

    <xsl:param name="testNumber" select="1500.99"></xsl:param>
    <xsl:template match="/">
        <root>
            <Val>
                <xsl:value-of select="format-number($testNumber, $double_2decimals, $decimal_format_name)"/>
            </Val>
        </root>
    </xsl:template>
</xsl:stylesheet>

0 个答案:

没有答案