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);
Другие вопросы по тегам