String.Format ("{0: C2}", -1234) (формат валюты) обрабатывает отрицательные числа как положительные - PullRequest
17 голосов
/ 16 июня 2009

Я использую String.Format("{0:C2}", -1234) для форматирования чисел.

Всегда форматирует сумму в положительное число, а я хочу, чтобы она стала $ - 1234

Ответы [ 3 ]

30 голосов
/ 16 июня 2009

Прав ли я, говоря, что он заключен в квадратные скобки, то есть форматируется как ($1,234.00)? Если так, то я считаю, что это намеченное поведение для США.

Однако вы можете создать свой собственный NumberFormatInfo, который так себя не ведет. Возьмите существующий NumberFormatInfo, который «в основном прав», вызовите Clone(), чтобы сделать изменчивую копию, и затем установите CurrencyNegativePattern соответствующим образом (я думаю, что вы хотите значение 2).

Например:

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

Это печатает $ 1,234.00. Если вы действительно хотите ровно $ -1234, вам нужно установить для свойства CurrencyGroupSizes значение new int[]{0} и использовать "{0:C0}" вместо "{0:C2}" в качестве строки формата.

РЕДАКТИРОВАТЬ: Вот вспомогательный метод, который вы можете использовать, который в основном делает то же самое:

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);
}
22 голосов
/ 21 июня 2011

Другой простой вариант - указать строку формата вручную.

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

Или, если символ валюты должен быть параметром, вы можете сделать это

String.Format("{0:" + symbol + "#,##0.00}", -1234)
9 голосов
/ 16 июня 2009

Я думаю, я просто буду использовать:

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

(в модуле Microsoft.VisualBasic.Strings)

Или более короткими словами (это то, что я собираюсь использовать):

FormatCurrency(-1234.56, 2, 0, 0)

Или я создам собственную функцию форматирования валюты, которая использует функцию VB, передавая мои пользовательские параметры.

Для получения более подробной информации взгляните на функцию FormatCurrency (Visual Basic) в MSDN.

...