From 438c1238767ffca7fb738ca693eef66efb9135c3 Mon Sep 17 00:00:00 2001 From: Alexander Babaev Date: Fri, 12 Nov 2021 14:55:04 +0300 Subject: [PATCH] 20211112 --- anbs_cp/CountFormatter.cs | 40 ++-------- anbs_cp/FileSizeFormatter.cs | 4 - anbs_cp/IValueFormatter.cs | 47 ++++++----- anbs_cp/anbs_cp.csproj | 4 + anbsoftware.componentspack.sln | 12 ++- demo/CountValueTest.Designer.cs | 134 ++++++++++++++++++++++++++++++++ demo/CountValueTest.cs | 42 ++++++++++ demo/CountValueTest.resx | 60 ++++++++++++++ demo/Program.cs | 15 ++++ demo/demo.csproj | 16 ++++ 10 files changed, 317 insertions(+), 57 deletions(-) create mode 100644 demo/CountValueTest.Designer.cs create mode 100644 demo/CountValueTest.cs create mode 100644 demo/CountValueTest.resx create mode 100644 demo/Program.cs create mode 100644 demo/demo.csproj diff --git a/anbs_cp/CountFormatter.cs b/anbs_cp/CountFormatter.cs index f6b608b..05bba3a 100644 --- a/anbs_cp/CountFormatter.cs +++ b/anbs_cp/CountFormatter.cs @@ -7,54 +7,28 @@ { #region Cвойства класса /// - /// Имена чисел ( , тысяч, миллионов, миллиардов и триллионов) + /// Имена чисел (тысяч, миллионов, миллиардов и т.п.) /// - public string[] SizeNames { get; set; } = { "Байт", "Кб", "Мб", "Гб", "Тб" }; + public string[] CountNames { get; set; } = { "", "тыс.", "млн.", "млрд." }; /// /// Знаков после запятой /// - public byte DecimalPlaces { get; set; } = 2; + public byte DecimalPlaces { get; set; } = 1; /// - /// Максимально байт (далее идут Кбайты) + /// Делители чисел /// - public long ByteMax { get; set; } = 1024; - /// - /// Максимально Кбайт (далее идут Мбайты) - /// - public long KByteMax { get; set; } = 1048576; - /// - /// Максимально Мбайт (далее идут Гбайты) - /// - public long MByteMax { get; set; } = 1073741824; - /// - /// Максимально Гбайт (далее идут Тбайты) - /// - public long GByteMax { get; set; } = 1099511627776; + public long[] Delimeters { get; set; } = { 1000, 1000000, 1000000000 }; #endregion #region Реализация интерфейса /// /// Реализация интерфейса /// - public string[] ValueNames { get => SizeNames; set => SizeNames = value; } + public string[] ValueNames { get => CountNames; set => CountNames = value; } /// /// Реализация интерфейса /// - public long[] MaxSizes - { - get => new long[] { ByteMax, KByteMax, MByteMax, GByteMax }; - set - { - ByteMax = value[0]; - KByteMax = value[1]; - MByteMax = value[2]; - GByteMax = value[3]; - } - } - /// - /// Реализация интерфейса - /// - public string Format(long value) => (this as IValueFormatter).Format(value); + public long[] MaxSizes { get => Delimeters; set => Delimeters = value; } #endregion } } \ No newline at end of file diff --git a/anbs_cp/FileSizeFormatter.cs b/anbs_cp/FileSizeFormatter.cs index e8e5537..a4cbd33 100644 --- a/anbs_cp/FileSizeFormatter.cs +++ b/anbs_cp/FileSizeFormatter.cs @@ -51,10 +51,6 @@ GByteMax = value[3]; } } - /// - /// Реализация интерфейса - /// - public string Format(long value) => (this as IValueFormatter).Format(value); #endregion } } \ No newline at end of file diff --git a/anbs_cp/IValueFormatter.cs b/anbs_cp/IValueFormatter.cs index 510d18e..36e0d3b 100644 --- a/anbs_cp/IValueFormatter.cs +++ b/anbs_cp/IValueFormatter.cs @@ -29,23 +29,29 @@ /// Форматированная размерность (например, 20 Мб) public string Format(long value) { - //Bytes - if (value < MaxSizes[0]) - return $"{value} {ValueNames[0]}"; - //KiloBytes - if ((value >= MaxSizes[0]) && (value < MaxSizes[1])) - return $"{FrmtSize(value, MaxSizes[0])} {ValueNames[1]}"; - //MegaBytes - if ((value >= MaxSizes[1]) && (value < MaxSizes[2])) - return $"{FrmtSize(value, MaxSizes[1])} {ValueNames[2]}"; - //GigaBytes - if ((value >= MaxSizes[2]) && (value < MaxSizes[3])) - return $"{FrmtSize(value, MaxSizes[2])} {ValueNames[3]}"; - //TeraBytes - if (value >= MaxSizes[3]) - return $"{FrmtSize(value, MaxSizes[3])} {ValueNames[4]}"; - //Не определён - return $"{value} {ValueNames[0]}"; + //Левая граница + long leftnum; + //Правая граница + long rightnum; + + for (int i = 0; i <= MaxSizes.Length; i++) + { + if (i == 0) + leftnum = 0; + else + leftnum = MaxSizes[i - 1]; + + if (i == MaxSizes.Length) + rightnum = long.MaxValue; + else + rightnum = MaxSizes[i]; + + if ((value >= leftnum) && (value < rightnum)) + return $"{FormatValue(value, leftnum)} {ValueNames[i]}"; + + } + + return value.ToString(); } /// /// Деление числа на число с DecimalPlaces знаками после запятой @@ -53,8 +59,13 @@ /// Делимое число /// Число-делитель /// Частное (с DecimalPlaces знаками после запятой) - private string FrmtSize(long dividend, long divider) + private string FormatValue(long dividend, long divider) { + if (divider == 0) + { + return $"{dividend}"; + } + long delim = 1; for (int i = 0; i <= DecimalPlaces; i++) diff --git a/anbs_cp/anbs_cp.csproj b/anbs_cp/anbs_cp.csproj index bc9380c..8d583a6 100644 --- a/anbs_cp/anbs_cp.csproj +++ b/anbs_cp/anbs_cp.csproj @@ -29,4 +29,8 @@ True + + + + diff --git a/anbsoftware.componentspack.sln b/anbsoftware.componentspack.sln index 4570fac..adc732b 100644 --- a/anbsoftware.componentspack.sln +++ b/anbsoftware.componentspack.sln @@ -1,10 +1,15 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31424.327 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "anbs_cp", "anbs_cp\anbs_cp.csproj", "{442A56CC-1061-4EB5-8B67-3E3D997976D7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "demo", "demo\demo.csproj", "{3BB0778D-3C34-4DD8-A54E-CB476BEF2F7B}" + ProjectSection(ProjectDependencies) = postProject + {442A56CC-1061-4EB5-8B67-3E3D997976D7} = {442A56CC-1061-4EB5-8B67-3E3D997976D7} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +20,9 @@ Global {442A56CC-1061-4EB5-8B67-3E3D997976D7}.Debug|Any CPU.Build.0 = Debug|Any CPU {442A56CC-1061-4EB5-8B67-3E3D997976D7}.Release|Any CPU.ActiveCfg = Release|Any CPU {442A56CC-1061-4EB5-8B67-3E3D997976D7}.Release|Any CPU.Build.0 = Release|Any CPU + {3BB0778D-3C34-4DD8-A54E-CB476BEF2F7B}.Debug|Any CPU.ActiveCfg = Release|Any CPU + {3BB0778D-3C34-4DD8-A54E-CB476BEF2F7B}.Debug|Any CPU.Build.0 = Release|Any CPU + {3BB0778D-3C34-4DD8-A54E-CB476BEF2F7B}.Release|Any CPU.ActiveCfg = Debug.CNF|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/demo/CountValueTest.Designer.cs b/demo/CountValueTest.Designer.cs new file mode 100644 index 0000000..6656a3b --- /dev/null +++ b/demo/CountValueTest.Designer.cs @@ -0,0 +1,134 @@ +namespace demo +{ + partial class CountValueTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.InsertDataLabel = new System.Windows.Forms.Label(); + this.InsertDataBox = new System.Windows.Forms.TextBox(); + this.ResultLabel = new System.Windows.Forms.Label(); + this.CalculateButton = new System.Windows.Forms.Button(); + this.SelectFormatterLabel = new System.Windows.Forms.Label(); + this.SelectFormatterBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // InsertDataLabel + // + this.InsertDataLabel.AutoSize = true; + this.InsertDataLabel.Location = new System.Drawing.Point(12, 66); + this.InsertDataLabel.Name = "InsertDataLabel"; + this.InsertDataLabel.Size = new System.Drawing.Size(197, 17); + this.InsertDataLabel.TabIndex = 0; + this.InsertDataLabel.Text = "&Insert any int value:"; + // + // InsertDataBox + // + this.InsertDataBox.Location = new System.Drawing.Point(12, 86); + this.InsertDataBox.Name = "InsertDataBox"; + this.InsertDataBox.Size = new System.Drawing.Size(246, 24); + this.InsertDataBox.TabIndex = 1; + // + // ResultLabel + // + this.ResultLabel.Dock = System.Windows.Forms.DockStyle.Bottom; + this.ResultLabel.Location = new System.Drawing.Point(0, 143); + this.ResultLabel.Margin = new System.Windows.Forms.Padding(5); + this.ResultLabel.Name = "ResultLabel"; + this.ResultLabel.Padding = new System.Windows.Forms.Padding(5); + this.ResultLabel.Size = new System.Drawing.Size(270, 79); + this.ResultLabel.TabIndex = 2; + this.ResultLabel.Text = "&Insert any int value to insert box above and press \"Calculate\" button to see res" + + "ult..."; + this.ResultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // CalculateButton + // + this.CalculateButton.Location = new System.Drawing.Point(81, 116); + this.CalculateButton.Name = "CalculateButton"; + this.CalculateButton.Size = new System.Drawing.Size(103, 23); + this.CalculateButton.TabIndex = 3; + this.CalculateButton.Text = "Calc&ulate"; + this.CalculateButton.UseVisualStyleBackColor = true; + this.CalculateButton.Click += new System.EventHandler(this.CalculateButton_Click); + // + // SelectFormatterLabel + // + this.SelectFormatterLabel.AutoSize = true; + this.SelectFormatterLabel.Location = new System.Drawing.Point(12, 9); + this.SelectFormatterLabel.Name = "SelectFormatterLabel"; + this.SelectFormatterLabel.Size = new System.Drawing.Size(161, 17); + this.SelectFormatterLabel.TabIndex = 4; + this.SelectFormatterLabel.Text = "&Select formatter:"; + // + // SelectFormatterBox + // + this.SelectFormatterBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.SelectFormatterBox.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.SelectFormatterBox.FormattingEnabled = true; + this.SelectFormatterBox.Items.AddRange(new object[] { + "CountFormatter", + "FileSizeFormatter"}); + this.SelectFormatterBox.Location = new System.Drawing.Point(12, 29); + this.SelectFormatterBox.Name = "SelectFormatterBox"; + this.SelectFormatterBox.Size = new System.Drawing.Size(246, 25); + this.SelectFormatterBox.TabIndex = 5; + // + // CountValueTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 17F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(270, 222); + this.Controls.Add(this.SelectFormatterBox); + this.Controls.Add(this.SelectFormatterLabel); + this.Controls.Add(this.CalculateButton); + this.Controls.Add(this.ResultLabel); + this.Controls.Add(this.InsertDataBox); + this.Controls.Add(this.InsertDataLabel); + this.Font = new System.Drawing.Font("Courier New", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "CountValueTest"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Formatter Test Unit"; + this.Load += new System.EventHandler(this.CountValueTest_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Label InsertDataLabel; + private TextBox InsertDataBox; + private Label ResultLabel; + private Button CalculateButton; + private Label SelectFormatterLabel; + private ComboBox SelectFormatterBox; + } +} \ No newline at end of file diff --git a/demo/CountValueTest.cs b/demo/CountValueTest.cs new file mode 100644 index 0000000..defe9b7 --- /dev/null +++ b/demo/CountValueTest.cs @@ -0,0 +1,42 @@ +using anbs_cp; +namespace demo +{ + public partial class CountValueTest : Form + { + public CountValueTest() + { + InitializeComponent(); + } + + private void CalculateButton_Click(object sender, EventArgs e) + { + + if (string.IsNullOrEmpty(InsertDataBox.Text)) + return; + + IValueFormatter formatter; + + long value = TypeConverter.StrToInt64(InsertDataBox.Text); + + switch (SelectFormatterBox.SelectedIndex) + { + case 0: + formatter = new CountFormatter(); + break; + case 1: + formatter = new FileSizeFormatter(); + break; + default: + formatter = new CountFormatter(); + break; + } + + ResultLabel.Text = formatter.Format(value); + } + + private void CountValueTest_Load(object sender, EventArgs e) + { + SelectFormatterBox.SelectedIndex = 0; + } + } +} \ No newline at end of file diff --git a/demo/CountValueTest.resx b/demo/CountValueTest.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/demo/CountValueTest.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/demo/Program.cs b/demo/Program.cs new file mode 100644 index 0000000..47c0157 --- /dev/null +++ b/demo/Program.cs @@ -0,0 +1,15 @@ +namespace demo +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + ApplicationConfiguration.Initialize(); + Application.Run(new CountValueTest()); + } + } +} \ No newline at end of file diff --git a/demo/demo.csproj b/demo/demo.csproj new file mode 100644 index 0000000..10977d6 --- /dev/null +++ b/demo/demo.csproj @@ -0,0 +1,16 @@ + + + + WinExe + net6.0-windows + enable + true + enable + Release;Debug.CNF + + + + + + + \ No newline at end of file