Format.cs

Static formatting helpers for HorizonRP. Formats money in dollars with French thousands spacing, weights in kilograms and ISO dates as DD/MM/YYYY.

namespace HorizonRP;

/// <summary>
/// Les formats du décor américain : la ville est aux États-Unis, le jeu parle
/// français. Dollars écrits à la française « 1 234 $ ». Vitesse en km/h et poids
/// en kilos (choix de Julien : seuls le décor et les documents sont américains,
/// avec leurs dates MM/DD/YYYY).
/// </summary>
public static class Format
{
	/// <summary>
	/// 1234 → « 1 234 $ » ; -50 → « -50 $ ». La monnaie est le dollar, l'écriture
	/// reste française (choix de Julien) : espace entre les milliers, symbole après.
	/// </summary>
	public static string Money( int value )
	{
		var digits = Math.Abs( (long)value ).ToString();
		var grouped = new System.Text.StringBuilder();
		for ( var i = 0; i < digits.Length; i++ )
		{
			if ( i > 0 && (digits.Length - i) % 3 == 0 )
				grouped.Append( ' ' );
			grouped.Append( digits[i] );
		}
		return $"{(value < 0 ? "-" : "")}{grouped} $";
	}

	/// <summary>0.25 → « 0,25 kg » ; 30 → « 30 kg ».</summary>
	public static string Kilos( float kilos ) => $"{kilos:0.##} kg".Replace( '.', ',' );

	/// <summary>« 2026-10-28 » → « 28/10/2026 » (les papiers sont en français, comme le jeu).</summary>
	public static string Date( string isoDate )
	{
		if ( string.IsNullOrWhiteSpace( isoDate ) || isoDate.Length < 10 )
			return "—";
		return $"{isoDate.Substring( 8, 2 )}/{isoDate.Substring( 5, 2 )}/{isoDate[..4]}";
	}
}