| | | 1 | | using System.Globalization; |
| | | 2 | | using Microsoft.AspNetCore.Html; |
| | | 3 | | |
| | | 4 | | namespace OzonOrdersWeb.Areas.Studio2.ViewHelpers; |
| | | 5 | | |
| | | 6 | | /// <summary> |
| | | 7 | | /// Единое представление чисел в списке заказов: разряды разделяются неразрывным тонким пробелом |
| | | 8 | | /// (не переносится и не рвёт выравнивание по правому краю), пустое значение — «—», |
| | | 9 | | /// отрицательное получает семантический класс вместо инлайнового color:red. |
| | | 10 | | /// Форматирование только визуальное — значения и типы модели не меняются. |
| | | 11 | | /// </summary> |
| | | 12 | | public static class OrderCellFormat |
| | | 13 | | { |
| | | 14 | | /// <summary>Заполнитель пустого значения.</summary> |
| | | 15 | | public const string Empty = "—"; |
| | | 16 | | |
| | | 17 | | /// <summary>U+202F — узкий неразрывный пробел, разделитель разрядов.</summary> |
| | | 18 | | private const string GroupSeparator = "\u202F"; |
| | | 19 | | |
| | 0 | 20 | | private static readonly NumberFormatInfo Nfi = new() |
| | 0 | 21 | | { |
| | 0 | 22 | | NumberGroupSeparator = GroupSeparator, |
| | 0 | 23 | | NumberDecimalSeparator = ",", |
| | 0 | 24 | | NumberNegativePattern = 1 // -n, без пробела после минуса |
| | 0 | 25 | | }; |
| | | 26 | | |
| | | 27 | | /// <summary>Целое денежное значение (рубли, без копеек).</summary> |
| | 0 | 28 | | public static IHtmlContent Money(decimal? value) => Number(value, 0); |
| | | 29 | | |
| | | 30 | | /// <summary>Число с заданным количеством знаков после запятой; null/пусто — «—».</summary> |
| | | 31 | | public static IHtmlContent Number(decimal? value, int decimals = 0) |
| | | 32 | | { |
| | 0 | 33 | | if (value is null) |
| | | 34 | | { |
| | 0 | 35 | | return new HtmlString(Empty); |
| | | 36 | | } |
| | | 37 | | |
| | 0 | 38 | | var text = value.Value.ToString("N" + decimals.ToString(CultureInfo.InvariantCulture), Nfi); |
| | 0 | 39 | | return new HtmlString(System.Net.WebUtility.HtmlEncode(text)); |
| | | 40 | | } |
| | | 41 | | |
| | | 42 | | /// <summary>Класс для семантической подсветки отрицательного/проблемного значения.</summary> |
| | | 43 | | public static string SignClass(decimal? value) |
| | 0 | 44 | | => value < 0 ? "orders-num orders-num--negative" : "orders-num"; |
| | | 45 | | } |