我想使用AutoMapper链接我的两个对象。它运行良好,但现在我想将我的小数项格式化为全数小数到2位小数。
这就是我所拥有的。我做错了什么?
Mapper.CreateMap<Object1, Object2>()
.ForMember(x => typeof(decimal), x => x.AddFormatter<RoundDecimalTwo>());
这是RoundDecimalTwo Formatter
public class RoundDecimalTwo : IValueFormatter
{
public string FormatValue(ResolutionContext context)
{
return Math.Round((decimal)context.SourceValue,2).ToString();
}
}
答案 0 :(得分:6)
您可能不知道的一件事是,默认情况下,Math.Round舍入到最低有效数字的最接近的偶数(“银行家舍入”),而不是简单地直到LSD的下一个整数值(“对称算术四舍五入“,你在小学里学到的方法)。因此,7.005的值将舍入到7(7.00),而不像Krabappel夫人教你的那样7.01。原因在于MSDN的math.round页面:http://msdn.microsoft.com/en-us/library/system.math.round.aspx
要更改此设置,请确保在您的回合中添加第三个参数MidpointRounding.AwayFromZero
。这将使用您熟悉的舍入方法:
return Math.Round((decimal)context.SourceValue,2, MidpointRounding.AwayFromZero).ToString();
此外,要确保即使一个或两个都为零,也始终显示两个小数位,请在ToString函数中指定数字格式。 “F”或“f”是好的;他们将以“定点”格式返回数字,在美国文化中默认为2(您可以通过指定小数位来覆盖默认值):
return Math.Round((decimal)context.SourceValue,2, MidpointRounding.AwayFromZero).ToString("F2");
答案 1 :(得分:0)
使用Math.Round如下所示:
Math.Round(yourDoubleValue, 2,MidpointRounding.AwayFromZero);