Move GetBytesReadable to Core, add tests

This commit is contained in:
Matt Nadareski
2025-04-14 20:45:02 -04:00
parent 44f96e7ef0
commit d45f903d41
5 changed files with 86 additions and 59 deletions

View File

@@ -102,5 +102,31 @@ namespace SabreTools.Core.Test.Tools
}
#endregion
#region GetBytesReadable
[Theory]
[InlineData(0, "0 B")]
[InlineData(1, "1 B")]
[InlineData(-1, "-1 B")]
[InlineData(0x400, "1 KB")]
[InlineData(-0x400, "-1 KB")]
[InlineData(1_234, "1.205 KB")]
[InlineData(-1_234, "-1.205 KB")]
[InlineData(0x10_0000, "1 MB")]
[InlineData(-0x10_0000, "-1 MB")]
[InlineData(0x4000_0000, "1 GB")]
[InlineData(-0x4000_0000, "-1 GB")]
[InlineData(0x100_0000_0000, "1 TB")]
[InlineData(-0x100_0000_0000, "-1 TB")]
[InlineData(0x4_0000_0000_0000, "1 PB")]
[InlineData(-0x4_0000_0000_0000, "-1 PB")]
public void GetBytesReadableTest(long input, string expected)
{
string actual = NumberHelper.GetBytesReadable(input);
Assert.Equal(expected, actual);
}
#endregion
}
}

View File

@@ -170,6 +170,62 @@ namespace SabreTools.Core.Tools
return true;
}
/// <summary>
/// Returns the human-readable file size for an arbitrary, 64-bit file size
/// The default format is "0.### XB", e.g. "4.2 KB" or "1.434 GB".
/// </summary>
/// <link>http://www.somacon.com/p576.php</link>
/// <remarks>This uses 1024-byte partitions, not 1000-byte</remarks>
public static string GetBytesReadable(long input)
{
// Get absolute value
long absolute_i = (input < 0 ? -input : input);
// Determine the suffix and readable value
string suffix;
double readable;
if (absolute_i >= 0x1000_0000_0000_0000) // Exabyte
{
suffix = "EB";
readable = (input >> 50);
}
else if (absolute_i >= 0x4_0000_0000_0000) // Petabyte
{
suffix = "PB";
readable = (input >> 40);
}
else if (absolute_i >= 0x100_0000_0000) // Terabyte
{
suffix = "TB";
readable = (input >> 30);
}
else if (absolute_i >= 0x4000_0000) // Gigabyte
{
suffix = "GB";
readable = (input >> 20);
}
else if (absolute_i >= 0x10_0000) // Megabyte
{
suffix = "MB";
readable = (input >> 10);
}
else if (absolute_i >= 0x400) // Kilobyte
{
suffix = "KB";
readable = input;
}
else
{
return input.ToString("0 B"); // Byte
}
// Divide by 1024 to get fractional value
readable /= 1024;
// Return formatted number with suffix
return readable.ToString("0.### ") + suffix;
}
#if NETFRAMEWORK || NETCOREAPP3_1 || NET5_0 || NET6_0
/// <summary>
/// Indicates whether a character is categorized as an ASCII hexademical digit.

View File

@@ -41,62 +41,5 @@ namespace SabreTools.Reports
/// <param name="throwOnError">True if the error that is thrown should be thrown back to the caller, false otherwise</param>
/// <returns>True if the report was written correctly, false otherwise</returns>
public abstract bool WriteToFile(string? outfile, bool baddumpCol, bool nodumpCol, bool throwOnError = false);
/// <summary>
/// Returns the human-readable file size for an arbitrary, 64-bit file size
/// The default format is "0.### XB", e.g. "4.2 KB" or "1.434 GB"
/// </summary>
/// <param name="input"></param>
/// <returns>Human-readable file size</returns>
/// <link>http://www.somacon.com/p576.php</link>
protected internal static string GetBytesReadable(long input)
{
// Get absolute value
long absolute_i = (input < 0 ? -input : input);
// Determine the suffix and readable value
string suffix;
double readable;
if (absolute_i >= 0x1000000000000000) // Exabyte
{
suffix = "EB";
readable = (input >> 50);
}
else if (absolute_i >= 0x4000000000000) // Petabyte
{
suffix = "PB";
readable = (input >> 40);
}
else if (absolute_i >= 0x10000000000) // Terabyte
{
suffix = "TB";
readable = (input >> 30);
}
else if (absolute_i >= 0x40000000) // Gigabyte
{
suffix = "GB";
readable = (input >> 20);
}
else if (absolute_i >= 0x100000) // Megabyte
{
suffix = "MB";
readable = (input >> 10);
}
else if (absolute_i >= 0x400) // Kilobyte
{
suffix = "KB";
readable = input;
}
else
{
return input.ToString("0 B"); // Byte
}
// Divide by 1024 to get fractional value
readable /= 1024;
// Return formatted number with suffix
return readable.ToString("0.### ") + suffix;
}
}
}

View File

@@ -6,6 +6,7 @@ using System.Net;
#endif
using System.Text;
using System.Xml;
using SabreTools.Core.Tools;
using SabreTools.DatFiles;
using SabreTools.DatItems;
using SabreTools.Hashing;
@@ -231,7 +232,7 @@ body {
xtw.WriteStartElement("td");
xtw.WriteAttributeString("align", "right");
xtw.WriteString(GetBytesReadable(stat.TotalSize));
xtw.WriteString(NumberHelper.GetBytesReadable(stat.TotalSize));
xtw.WriteEndElement(); // td
xtw.WriteStartElement("td");

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using SabreTools.Core.Tools;
using SabreTools.DatFiles;
using SabreTools.DatItems;
using SabreTools.Hashing;
@@ -94,7 +95,7 @@ namespace SabreTools.Reports.Formats
{
string line = @"'" + stat.DisplayName + @"':
--------------------------------------------------
Uncompressed size: " + GetBytesReadable(stat!.TotalSize) + @"
Uncompressed size: " + NumberHelper.GetBytesReadable(stat!.TotalSize) + @"
Games found: " + stat.MachineCount + @"
Roms found: " + stat.GetItemCount(ItemType.Rom) + @"
Disks found: " + stat.GetItemCount(ItemType.Disk) + @"