格式化十进制以在XML中使用并忽略文化

时间:2014-06-10 10:33:47

标签: c# .net xml

我们需要将十进制值插入XML文档(由XML编写器完成),该文档工作正常。首先我们使用XmlConvert.ToString(myDecimalValue)打印四位数的值。现在我们被迫总是使用两位数,我们试图改变这一点,但到目前为止没有运气。

首先我们放弃了XmlConvert的使用,因为我们发现没有超载允许我们格式化小数,所以我们尝试myDecimalValue.ToString("0.00")只打印两位数,但用{替换. {1}}在我们的案例中无效。

那么我们如何将像,这样的小数格式化为25000.00m之类的字符串? (舍入无关紧要,因为值永远不会超过两位数)

修改

25000.00

写在哪里

decimal m_nAmt;
public decimal Amount
{
    get
    {
        return m_nAmt;
    }
    set
    {
        if ((value < 0M) || (value > 999999999.99M))
        {
            throw new ArgumentOutOfRangeException();
        }
        if (SepaUtil.DecimalPlaces(value) > 2)
        {
            throw new ArgumentException();
        }

        m_nAmt = value;
    }
}

两种方法都是同一类的成员;

以下是写入Xml文件

的值的示例
// the original method
XmlConvert.ToString(m_nAmt);
  • 一个重要的注意事项是,这是类库的一部分,它涵盖了SEPA标准的部分内容,但作者没有提供任何支持。*

修改2

编写节点的示例。我使用立即窗口获取<InstdAmt Ccy="EUR">3360.0000</InstdAmt> 属性(System.Decimal)的当前值和ControlSum写的值。结果是XmlConvert确实写了四个小数位,但我在LINQPad中使用带有十进制变量的XmlConvert时无法确认。其中一个区别是该库使用.net 2.0

enter image description here

我的结论&amp;溶液

XmlConvertXmlConvert.ToString()似乎应用了四个小数位,因为原始值有四个decimalvalue.ToString()已被0检查忽略(因为{{1}被忽略)并且没有显示在&#34;立即窗口&#34; VS2012。所以我改变了

SepaUtil.DecimalPlaces(value)

0

确保始终为小数点后两位。这种方式会添加丢失的小数位,如果还有更多,则会截断。

2 个答案:

答案 0 :(得分:5)

使用

myValue.ToString("0.00", CultureInfo.InvariantCulture);

这将始终以与语言无关的格式(基本上是英语)写入值。阅读时,在任何Parse()TryParse()来电中使用相同的参数。

作为一般规则,所有 Parse()TryParse()ToString()调用都应指定CultureInfo参数,可以是CultureInfo.InvariantCulture或{ {1}}。这可以防止当用户语言使用与开发人员不同的十进制标记时发生的任何奇怪错误。

答案 1 :(得分:2)

假设这确实是decimal,我建议你先将小数值四舍五入

decimal rounded = Math.Round(original, 2);
string roundedText = XmlConvert.ToString(rounded);

显然,您也可以指定适当的舍入/截断行为。

虽然你可以根据PMF的答案指定不变文化,但我会认为上述内容更清楚你想要实现的目标:

  • 你特意将价值四舍五入
  • 您专门使用XML转换

然而,有一点不同 - 在我上面的版本中,如果原始数字只有一个小数位(或没有),那么你最终会得到(比方说)“15.5”。如果使用不变文化显式格式化字符串,则最终会得到“15.50”。如果你肯定总是想要正好2个小数位(不少),那么PMF的答案就更合适了。