我们需要将十进制值插入工作正常的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的答案是一个更合适的答案。