2011-02-24 155 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

相關問題