60 votes

Format de la devise à afficher

Existe-t-il un moyen de formater la représentation correcte de la devise pour un pays ?

Exemple ROYAUME-UNI -127,54 £ Pays-Bas € 127,54- USA -127,54

etc.

Quelques éléments à prendre en compte,

  1. Symbole de la monnaie

  2. Placement du symbole de la monnaie -- Il peut être placé avant ou après les chiffres.

  3. Affichage du montant négatif

2voto

Clint Good Points 465

Si vous n'avez que le symbole de la devise et le nombre de décimales, vous pouvez utiliser la fonction d'aide suivante, qui respecte l'ordre des symboles/montants, les séparateurs, etc., en ne modifiant que le symbole de la devise lui-même et le nombre de décimales à afficher.

public static string FormatCurrency(string currencySymbol, Decimal currency, int decPlaces)
{
    NumberFormatInfo localFormat = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
    localFormat.CurrencySymbol = currencySymbol;
    localFormat.CurrencyDecimalDigits = decPlaces;
    return currency.ToString("c", localFormat);
}

0voto

modiX Points 397

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);
    }
}

-6voto

public static string ToFormattedCurrencyString(
    this decimal currencyAmount,
    string isoCurrencyCode,
    CultureInfo userCulture)
{
    var userCurrencyCode = new RegionInfo(userCulture.Name).ISOCurrencySymbol;

if (userCurrencyCode == isoCurrencyCode)
{
    return currencyAmount.ToString("C", userCulture);
}

return string.Format(
    "{0} {1}", 
    isoCurrencyCode, 
    currencyAmount.ToString("N2", userCulture));

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X