我们需要将十进制值插入工作正常的XML文档(由XML编写者完成)中。首先,我们使用XmlConvert.ToString(myDecimalValue)来打印带有四位数字的值。现在我们被迫总是使用两位数,并且我们试图更改它,但到目前为止还没有运气。

首先,我们放弃使用XmlConvert,因为我们发现没有过载允许我们设置小数点的格式,因此我们尝试了myDecimalValue.ToString("0.00"),它仅输出两位数字,但用.替换,,在我们的情况下无效。

那么,如何将小数位数(如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;
    }
}


并写在哪里

// the original method
XmlConvert.ToString(m_nAmt);


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

这是写入Xml文件的值的示例

<InstdAmt Ccy="EUR">3360.0000</InstdAmt>



重要说明是,这是类库的一部分,它涵盖了SEPA标准的某些部分,但作者未提供任何支持。*


编辑2

一个写入节点的示例。我使用立即窗口获取了ControlSum属性(System.Decimal)的当前值和XmlConvert写入的值。结果是XmlConvert确实写了四个小数位,尽管我无法确认在LINQPad中将XmlConvert与小数变量一起使用时。区别在于此库使用.net 2.0



我的结论与解决方案

似乎XmlConvert.ToString()decimalvalue.ToString()应用了四个小数位,因为原始值应用了四个0,但被SepaUtil.DecimalPlaces(value)检查忽略了(因为0被忽略了),并且没有显示在“立即”中VS2012的“窗口”。所以我改变了

 m_nAmt = value;




m_nAmt = Math.Round(value,2);


确保始终保留小数点后两位。这种方法将添加缺少的小数位,如果有更多的则截断。

最佳答案

假设这确实是decimal,建议您先舍入十进制值:

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


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

虽然您可以按照PMF的回答指定不变的文化,但我认为上面的内容在您要实现的目标上更加清晰:


您正在舍入价值
您正在专门使用XML转换


但是,有一个区别-在上面的版本中,如果原始数字只有一位小数(或没有小数位),您将得到(例如)“ 15.5”。如果您使用不变的区域性显式设置字符串格式,则最终将得到“ 15.50”。如果您确实总是希望精确到小数点后两位(不少于),那么PMF的答案是一个更合适的答案。

10-08 14:23