我读了这些东西,例如:
但是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>