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();
}
}
1 ответ
Одна вещь, которую вы можете не знать, это то, что Math.Round по умолчанию округляет до ближайшего числа EVEN для младшей цифры ("округление банкиров"), а не просто до следующего целочисленного значения LSD ("симметричное арифметическое округление"). "метод, который вы изучили в начальной школе). Таким образом, значение 7,005 округляется до 7 (7,00), а НЕ 7,01, как вас учила миссис Крабаппел. Причины на странице math.round MSDN: 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");
Используйте Math.Round, как показано ниже:
Math.Round(yourDoubleValue, 2,MidpointRounding.AwayFromZero);