Add project files.
This commit is contained in:
3
XStringUtils.slnx
Normal file
3
XStringUtils.slnx
Normal file
@@ -0,0 +1,3 @@
|
||||
<Solution>
|
||||
<Project Path="XStringUtils/XStringUtils.csproj" />
|
||||
</Solution>
|
||||
113
XStringUtils/Prettify.cs
Normal file
113
XStringUtils/Prettify.cs
Normal file
@@ -0,0 +1,113 @@
|
||||
using System.Globalization;
|
||||
using System.Numerics;
|
||||
|
||||
namespace XStringUtils;
|
||||
|
||||
public static partial class XStringUtils
|
||||
{
|
||||
public static string PrettifyTiny(double number)
|
||||
{
|
||||
return number > 0.0001
|
||||
? number.ToString("F4", CultureInfo.InvariantCulture)
|
||||
: number.ToString("E3", CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
public enum Notation
|
||||
{
|
||||
KMB,
|
||||
Logarithmic10,
|
||||
LogarithmicE,
|
||||
}
|
||||
|
||||
extension<T>(T number) where T : IFloatingPoint<T>, ILogarithmicFunctions<T>, IPowerFunctions<T>
|
||||
{
|
||||
public string Prettify(Notation notation = Notation.KMB)
|
||||
{
|
||||
if (!T.IsFinite(number))
|
||||
{
|
||||
return "∞";
|
||||
}
|
||||
|
||||
if (number == T.Zero)
|
||||
{
|
||||
return PrettifySub(0.0);
|
||||
}
|
||||
|
||||
if (number < T.Zero)
|
||||
{
|
||||
return "-" + Prettify(-number, notation);
|
||||
}
|
||||
|
||||
if (number < T.CreateChecked(0.005))
|
||||
{
|
||||
return number.ToString("E2", CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
int @base = int.CreateChecked(T.Floor(T.Log(number) / T.Log(T.CreateChecked(1000))));
|
||||
|
||||
if (@base <= 0)
|
||||
{
|
||||
return PrettifySub(number);
|
||||
}
|
||||
|
||||
if (notation == Notation.Logarithmic10 || notation == Notation.LogarithmicE)
|
||||
{
|
||||
T logBase = notation == Notation.Logarithmic10 ? T.CreateChecked(10) : T.E;
|
||||
T exponent = T.Log(number, logBase);
|
||||
return PrettifySub(exponent) + "L" + logBase;
|
||||
}
|
||||
|
||||
T thousand = T.CreateChecked(1000);
|
||||
T tbase = T.CreateChecked(@base);
|
||||
|
||||
number /= T.Pow(thousand, tbase);
|
||||
|
||||
// Prevent 1000K, 1000M, etc.
|
||||
if (number >= T.CreateChecked(999.5))
|
||||
{
|
||||
number /= thousand;
|
||||
@base++;
|
||||
}
|
||||
|
||||
string suffix = ResolveSuffix(@base);
|
||||
|
||||
return PrettifySub(number) + suffix;
|
||||
}
|
||||
}
|
||||
|
||||
private static string PrettifySub<T>(T number) where T : IFloatingPoint<T>
|
||||
{
|
||||
T floor = T.Floor(number);
|
||||
|
||||
if (number == floor)
|
||||
{
|
||||
return number.ToString(null, CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
int precision = 3 - floor.ToString(null, CultureInfo.InvariantCulture).Length;
|
||||
|
||||
return number.ToString("F" + precision, CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
private static readonly string[] Suffices =
|
||||
[
|
||||
"K","M","B","T","Qa","Qi","Sx","Sp","Oc","No","Dc","Ud",
|
||||
"Dd","Td","Qad","Qid","Sxd","Spd","Od","Nd","V","Uv","Dv",
|
||||
"Tv","Qav","Qiv","Sxv","Spv","Ov","Nv","Tg","Utg","Dtg","Ttg",
|
||||
"Qatg","Qitg","Sxtg","Sptg","Otg","Ntg","Qaa","Uqa","Dqa","Tqa",
|
||||
"Qaqa","Qiqa","Sxqa","Spqa","Oqa","Nqa","Qia","Uqi","Dqi",
|
||||
"Tqi","Qaqi","Qiqi","Sxqi","Spqi","Oqi","Nqi","Sxa","Usx",
|
||||
"Dsx","Tsx","Qasx","Qisx","Sxsx","Spsx","Osx","Nsx","Spa",
|
||||
"Usp","Dsp","Tsp","Qasp","Qisp","Sxsp","Spsp","Osp","Nsp",
|
||||
"Og","Uog","Dog","Tog","Qaog","Qiog","Sxog","Spog","Oog",
|
||||
"Nog","Na","Un","Dn","Tn","Qan","Qin","Sxn","Spn","On",
|
||||
"Nn","Ct","Uc"
|
||||
];
|
||||
|
||||
private static string ResolveSuffix(int @base)
|
||||
{
|
||||
return @base <= Suffices.Length
|
||||
? Suffices[@base - 1]
|
||||
: "e" + (@base * 3);
|
||||
}
|
||||
}
|
||||
34
XStringUtils/XStringUtils.csproj
Normal file
34
XStringUtils/XStringUtils.csproj
Normal file
@@ -0,0 +1,34 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<SignAssembly>False</SignAssembly>
|
||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||
<Title>XStringUtils</Title>
|
||||
<Authors>SacredFloof</Authors>
|
||||
<Company>SacredFloof</Company>
|
||||
<Description>Small string utilities. AOT-friendly</Description>
|
||||
<Copyright>SacredFloof 2026</Copyright>
|
||||
<PackageTags>Utility</PackageTags>
|
||||
<AssemblyVersion>1.0.1</AssemblyVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<IsTrimmable>True</IsTrimmable>
|
||||
<IsAotCompatible>True</IsAotCompatible>
|
||||
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<IsTrimmable>True</IsTrimmable>
|
||||
<IsAotCompatible>True</IsAotCompatible>
|
||||
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
|
||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)'=='Release'">
|
||||
<Exec Command="dotnet nuget push -s Gitea --api-key %25GITEA_API_KEY%25 '.\bin\Release\XStringUtils.$(Version).nupkg'" />
|
||||
</Target>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user