Вопрос:

Automapper устанавливает десятичные числа на все 2 десятичных знака

c# mapping automapper

1760 просмотра

2 ответа

308 Репутация автора

Я хочу использовать 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();
        }
    }
Автор: colemande Источник Размещён: 24.02.2011 10:38

Ответы (2)


6 плюса

57586 Репутация автора

Решение

Одна вещь, которую вы можете не знать, это то, что 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");
Автор: KeithS Размещён: 24.02.2011 11:17

0 плюса

871 Репутация автора

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

Math.Round(yourDoubleValue, 2,MidpointRounding.AwayFromZero);
Автор: Abdus Salam Azad Размещён: 13.06.2019 04:47
Вопросы из категории :
32x32