Il se peut que vous ne puissiez pas du tout utiliser l'approche par culture, par exemple lorsque vous voulez avoir un formatage spécifique indépendamment de toute culture ou devise. Même l'approche de @jackjgordon n'est pas fiable, car certaines cultures ont un format de nombre différent de celui de la devise, ce qui rend cette approche incohérente.
Voici un formateur manuel qui fonctionne sans aucune culture, afin que vous puissiez formater vos chiffres de manière indépendante.
public static class CustomNumberFormatExtensions
{
static readonly StringBuilder formatTextBuilder = new StringBuilder();
public static string ToCustomFormattedString(this decimal d, int decimalPrecision, string decimalPoint, string groupSeperator = "", int groupLength = 3, MidpointRounding rounding = MidpointRounding.AwayFromZero)
{
lock (formatTextBuilder)
{
formatTextBuilder.Clear();
string rawDigits = Math.Round(d * (decimal)Math.Pow(10, decimalPrecision), 0, rounding).ToString();
rawDigits = rawDigits.PadLeft(decimalPrecision + 1, '0');
if (decimalPrecision > 0)
{
formatTextBuilder.Insert(0, rawDigits.Substring(rawDigits.Length - decimalPrecision));
rawDigits = rawDigits.Substring(0, rawDigits.Length - decimalPrecision);
formatTextBuilder.Insert(0, decimalPoint);
}
while (rawDigits.Length > groupLength)
{
formatTextBuilder.Insert(0, rawDigits.Substring(rawDigits.Length - groupLength));
rawDigits = rawDigits.Substring(0, rawDigits.Length - groupLength);
formatTextBuilder.Insert(0, groupSeperator);
}
return rawDigits + formatTextBuilder.ToString();
}
}
public static string ToCustomFormattedString(this double d, int decimalPrecision, string decimalSeperator, string groupSeperator = "", int groupLength = 3, MidpointRounding rounding = MidpointRounding.AwayFromZero)
{
return ((decimal)d).ToCustomFormattedString(decimalPrecision, decimalSeperator, groupSeperator, groupLength, rounding);
}
}