Automapper устанавливает десятичные числа на все 2 десятичных знака - PullRequest
2 голосов
/ 25 февраля 2011

Я хочу использовать 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();
        }
    }

Ответы [ 2 ]

6 голосов
/ 25 февраля 2011

Одна вещь, которую вы можете не знать, это то, что 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");
0 голосов
/ 13 июня 2019

Используйте Math.Round, как показано ниже:

Math.Round(yourDoubleValue, 2,MidpointRounding.AwayFromZero);
...