Skip to content

Instantly share code, notes, and snippets.

@ufcpp
Created March 20, 2024 05:55
Show Gist options
  • Save ufcpp/0825b4f87c99e721693555dfcd652a0d to your computer and use it in GitHub Desktop.
Save ufcpp/0825b4f87c99e721693555dfcd652a0d to your computer and use it in GitHub Desktop.
for (uint i = 0; i < 12; i++)
{
Console.WriteLine(format(i));
}
for (uint i = 15; i < 120; i+=7)
{
Console.WriteLine(format(i));
}
Console.WriteLine(format(1234));
Console.WriteLine(format(987_654_321));
Console.WriteLine(format(5_1230_1230));
Console.WriteLine(format(1020304050));
for (uint i = 10; i < 10_0000_0000; i*=10)
{
Console.WriteLine(format(i));
}
Console.WriteLine(format(1222_2222_2222_2222_2222));
Console.WriteLine(format(12_3456_7890_1234_5678));
Console.WriteLine(format(1000_0000_0001_1010_0000));
Console.WriteLine(format(ulong.MaxValue));
static string format(ulong x)
{
if (x == 0) return "〇";
ReadOnlySpan<char> DigitChars = "一二三四五六七八九";
ReadOnlySpan<char> PowerChars = "十百千";
ReadOnlySpan<char> MyriadChars = "万億兆京";
Span<byte> digitBuffer = stackalloc byte[24];
int digits = 0;
for (; x != 0 && digits < 21; digits++)
{
(x, var r) = ulong.DivRem(x, 10);
digitBuffer[digits] = (byte)r;
}
Span<char> charBuffer = stackalloc char[40];
var len = 0;
for (var myriads = digits / 4; myriads >= 0; myriads--)
{
var myriadSlice = digitBuffer.Slice((myriads * 4), 4);
var prev = len;
for (int n = 3; n > 0; n--)
{
var d = myriadSlice[n];
if (d != 0)
{
if (d != 1) charBuffer[len++] = DigitChars[d - 1];
charBuffer[len++] = PowerChars[n - 1];
}
}
var d0 = myriadSlice[0];
if (d0 != 0) charBuffer[len++] = DigitChars[d0 - 1];
if (myriads != 0 && prev != len) charBuffer[len++] = MyriadChars[myriads - 1];
}
return new(charBuffer[..len]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment