2011-02-24 160 views
1

我想使用AutoMapper将两个对象链接起来。它运行良好,但现在我想将小数点的项目格式化为2位小数。Automapper将小数设置为全部为2位小数

这就是我所拥有的。我究竟做错了什么?

Mapper.CreateMap<Object1, Object2>() 
.ForMember(x => typeof(decimal), x => x.AddFormatter<RoundDecimalTwo>()); 

这里是RoundDecimalTwo格式化

public class RoundDecimalTwo : IValueFormatter 
    { 
     public string FormatValue(ResolutionContext context) 
     { 
      return Math.Round((decimal)context.SourceValue,2).ToString(); 
     } 
    } 
+0

而且你的十进制性能确实只是小数(而不是可为空)? – 2011-02-24 22:51:26

回答

5

一个你可能不知道的是,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"); 
+3

如果我可以为Curoub夫人提供额外的+1,我会给予额外的+1。 – 2012-07-02 05:08:28

相关问题