20221224-1

This commit is contained in:
Alexander
2022-12-24 15:01:07 +03:00
parent 2ea36fe8a0
commit af7a5dd299
11 changed files with 177 additions and 13 deletions

View File

@@ -0,0 +1,17 @@
namespace anbs_cp.Interfaces;
/// <summary>
/// Интерфейс конвертера величин для отображения (улучшенный аналог IValueFormatter)
/// </summary>
public interface IValueConverter
{
/// <summary>
/// Массив имён размерностей
/// </summary>
public string[] ValueNames { get; init; }
/// <summary>
/// Делитель
/// </summary>
public long Divider { get; init; }
}

View File

@@ -0,0 +1,74 @@
namespace anbs_cp.Interfaces;
/// <summary>
/// Форматирует размерности в понятную строку
/// </summary>
public interface IValueFormatter
{
#region Определения интерфейса
/// <summary>
/// Имена размерностей
/// </summary>
public string[] ValueNames { get; set; }
/// <summary>
/// Знаков после запятой
/// </summary>
public byte DecimalPlaces { get; set; }
/// <summary>
/// Максимальные размеры (массив ulong[4])
/// </summary>
public long[] MaxSizes { get; set; }
#endregion
#region Методы интерфейса
/// <summary>
/// Форматирование размерности
/// </summary>
/// <param name="value">Размерность, требующая форматирования</param>
/// <returns>Форматированная размерность (например, 20 Мб)</returns>
public string Format(long value)
{
//Левая граница
long leftnum;
//Правая граница
long rightnum;
for (int i = 0; i <= MaxSizes.Length; i++)
{
leftnum = i == 0 ? 0 : MaxSizes[i - 1];
rightnum = i == MaxSizes.Length ? long.MaxValue : MaxSizes[i];
if (value >= leftnum && value < rightnum)
return $"{FormatValue(value, leftnum)} {ValueNames[i]}";
}
return value.ToString();
}
/// <summary>
/// Деление числа на число с DecimalPlaces знаками после запятой
/// </summary>
/// <param name="dividend">Делимое число</param>
/// <param name="divider">Число-делитель</param>
/// <returns>Частное (с DecimalPlaces знаками после запятой)</returns>
private string FormatValue(long dividend, long divider)
{
if (divider == 0) return $"{dividend}";
long delim = 1;
for (int i = 0; i <= DecimalPlaces; i++) delim *= 10;
decimal value = Math.Round((decimal)(dividend * delim / divider)) / delim;
return $"{value}";
}
#endregion
}