mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
Move GetBytesReadable to Core, add tests
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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) + @"
|
||||
|
||||
Reference in New Issue
Block a user