Scripts/Utils/Formatter.cs
using System;
using System.Globalization;

namespace Milaine.Utils;

public static class Formatter {
  private static readonly string[] Suffixes = ["", "k", "M", "B", "T", "Qa", "Qi"];

  /// <summary>
  /// format float numbers from 1000 to 1.000
  /// </summary>
  /// <param name="val"></param>
  /// <returns></returns>
  public static string ToDisplay(float val) {
    string native = val.ToString("#,##0", CultureInfo.InvariantCulture);
    string display = native.Replace(',', '.');

    return display;
  }

  /// <summary>
  /// format from 1000 to 1.0K
  /// </summary>
  /// <param name="val"></param>
  /// <returns></returns>
  public static string ToDisplayShort(float val) {
    double absVal = Math.Abs((double)val);

    if (absVal < 1000d) {
      return Math.Round(val).ToString(CultureInfo.InvariantCulture);
    }

    int magnitude = (int)Math.Log(absVal, 1000d);
    magnitude = Math.Min(magnitude, Suffixes.Length - 1);

    double scaled = val / Math.Pow(1000d, magnitude);

    if (Math.Round(scaled, 1) >= 1000d && magnitude < Suffixes.Length - 1) {
      magnitude++;
      scaled = val / Math.Pow(1000d, magnitude);
    }

    string number = scaled.ToString("0.0", CultureInfo.InvariantCulture);

    return $"{number}{Suffixes[magnitude]}";
  }
}