web-dev-qa-db-fra.com

String.Format ("{0: C2}", -1234) (format monétaire) traite les nombres négatifs comme positifs

J'utilise String.Format("{0:C2}", -1234) pour formater les nombres.

Il formate toujours le montant en un nombre positif, alors que je veux qu'il devienne $ - 1234

17
Shimmy

Je pense que je vais simplement utiliser:

FormatCurrency(-1234.56, 2, UseParensForNegativeNumbers:=TriState.False)

(dans le module Microsoft.VisualBasic.Strings)

Ou en termes plus courts (c'est ce que je vais réellement utiliser):

FormatCurrency(-1234.56, 2, 0, 0)

Ou je vais me faire une fonction formatcurrency personnalisée qui utilise la fonction VB en passant mes paramètres personnalisés.

Pour plus de détails, consultez la Fonction FormatCurrency (Visual Basic) dans le msdn.

9
Shimmy

Ai-je raison de dire qu'il le met entre crochets, c'est-à-dire qu'il le met en forme comme ($1,234.00)? Si c'est le cas, je crois que c'est le comportement prévu pour les États-Unis.

Cependant, vous pouvez créer votre propre NumberFormatInfo qui ne se comporte pas de cette façon. Prenez un NumberFormatInfo existant qui est "pour la plupart correct", appelez Clone() pour faire une copie modifiable, puis définissez CurrencyNegativePattern de manière appropriée (I pensez que vous voulez la valeur 2).

Par exemple:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        var usCulture = CultureInfo.CreateSpecificCulture("en-US");
        var clonedNumbers = (NumberFormatInfo) usCulture.NumberFormat.Clone();
        clonedNumbers.CurrencyNegativePattern = 2;
        string formatted = string.Format(clonedNumbers, "{0:C2}", -1234);
        Console.WriteLine(formatted);
    }
}

Cela imprime -1 234,00 $. Si vous voulez réellement exactement $ -1234, vous devrez définir la propriété CurrencyGroupSizes sur new int[]{0} Et utiliser "{0:C0}" Au lieu de "{0:C2}" Comme chaîne de format.

EDIT: Voici une méthode d'aide que vous pouvez utiliser qui fait essentiellement la même chose:

private static readonly NumberFormatInfo CurrencyFormat = CreateCurrencyFormat();

private static NumberFormatInfo CreateCurrencyFormat()
{
    var usCulture = CultureInfo.CreateSpecificCulture("en-US");
    var clonedNumbers = (NumberFormatInfo) usCulture.NumberFormat.Clone();
    clonedNumbers.CurrencyNegativePattern = 2;
    return clonedNumbers;
}

public static string FormatCurrency(decimal value)
{
    return value.ToString("C2", CurrencyFormat);
}
30
Jon Skeet

Une autre option simple consiste à spécifier manuellement la chaîne de format.

String.Format("{0:$#,##0.00}", -1234)

Ou, si le symbole monétaire doit être un paramètre, vous pouvez le faire

String.Format("{0:" + symbol + "#,##0.00}", -1234)
22
epotter