20221224-1
This commit is contained in:
20
anbs_cp/Classes/CountConverter.cs
Normal file
20
anbs_cp/Classes/CountConverter.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Конвертер количества элементов
|
||||
/// </summary>
|
||||
public sealed class CountConverter : ValueConverter
|
||||
{
|
||||
/// <summary>
|
||||
/// Имена размеров файлов по умолчанию
|
||||
/// </summary>
|
||||
public static readonly string[] DefaultNames = {"", "тыс.", "млн."};
|
||||
|
||||
/// <summary>
|
||||
/// Конструктор класса
|
||||
/// </summary>
|
||||
/// <param name="valueNames">Массив имён размерностей</param>
|
||||
public CountConverter (string[] valueNames) : base(valueNames, 1000)
|
||||
{
|
||||
}
|
||||
}
|
@@ -1,4 +1,6 @@
|
||||
namespace anbs_cp.Classes;
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Форматирует число элементов в понятную строку
|
||||
|
20
anbs_cp/Classes/FileSizeConverter.cs
Normal file
20
anbs_cp/Classes/FileSizeConverter.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Конвертер размеров файлов
|
||||
/// </summary>
|
||||
public sealed class FileSizeConverter : ValueConverter
|
||||
{
|
||||
/// <summary>
|
||||
/// Имена размеров файлов по умолчанию
|
||||
/// </summary>
|
||||
public static readonly string[] DefaultNames = {"байт", "Кб", "Мб", "Гб", "Тб"};
|
||||
|
||||
/// <summary>
|
||||
/// Конструктор класса
|
||||
/// </summary>
|
||||
/// <param name="valueNames">Массив имён размерностей</param>
|
||||
public FileSizeConverter (string[] valueNames) : base(valueNames, 1024)
|
||||
{
|
||||
}
|
||||
}
|
@@ -1,4 +1,6 @@
|
||||
namespace anbs_cp.Classes;
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Форматирует размер файла/папки в понятную строку
|
||||
|
@@ -1,74 +0,0 @@
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <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
|
||||
}
|
72
anbs_cp/Classes/ValueConverter.cs
Normal file
72
anbs_cp/Classes/ValueConverter.cs
Normal file
@@ -0,0 +1,72 @@
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Абстрактный класс конвертера величин для отображения (улучшенный аналог ValueFormatter)
|
||||
/// </summary>
|
||||
public abstract class ValueConverter: IValueConverter
|
||||
{
|
||||
/// <summary>
|
||||
/// Конструктор
|
||||
/// </summary>
|
||||
/// <param name="valueNames">Массив имён размерностей</param>
|
||||
/// <param name="divider">Делитель</param>
|
||||
protected ValueConverter (string[] valueNames, long divider)
|
||||
{
|
||||
ValueNames = valueNames;
|
||||
Divider = divider;
|
||||
}
|
||||
|
||||
#region Реализация интерфейса
|
||||
/// <summary>
|
||||
/// Массив имён размерностей
|
||||
/// </summary>
|
||||
public string[] ValueNames { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Делитель
|
||||
/// </summary>
|
||||
public long Divider { get; init; }
|
||||
#endregion
|
||||
|
||||
#region Методы
|
||||
/// <summary>
|
||||
/// Функция конвертирования в строку
|
||||
/// </summary>
|
||||
/// <param name="value">Значение</param>
|
||||
/// <returns>Конвертирование значение в строку</returns>
|
||||
public string Convert (long value)
|
||||
{
|
||||
(decimal, int) result = DivideIt(value, 0);
|
||||
|
||||
return $"{result.Item1:F2} {ValueNames[result.Item2]}";
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Рекурсивная функция деления
|
||||
/// </summary>
|
||||
/// <param name="value">Число</param>
|
||||
/// <param name="count">Счётчик вызова рекурсии</param>
|
||||
/// <returns>Число в остатке и количество вызовов рекурсии</returns>
|
||||
private (decimal, int) DivideIt (decimal value, int count)
|
||||
{
|
||||
//Если счёт уже больше количества названий
|
||||
if (count > ValueNames.Length)
|
||||
return (value, count);
|
||||
|
||||
//Если частное уже меньше делителя, то прерываем цикл
|
||||
if (value < Divider)
|
||||
return (value, count);
|
||||
|
||||
//Увеличиваем счётчик...
|
||||
count++;
|
||||
|
||||
//... и продолжаем цикл
|
||||
return DivideIt(value / Divider, count);
|
||||
|
||||
|
||||
}
|
||||
#endregion
|
||||
}
|
Reference in New Issue
Block a user