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

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

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

Ответы

Ответ 1

Думаю, я просто использую:

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

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

Или короче слов (это то, что им действительно нужно использовать):

FormatCurrency(-1234.56, 2, 0, 0)

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

Для получения дополнительной информации см. FormatCurrency Function (Visual Basic) в msdn.

Ответ 2

Я правильно говорю, что он помещает его в скобки, т.е. форматирует его как ($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}" в качестве строки формата.

EDIT: здесь используется вспомогательный метод, который в основном делает то же самое:

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

Ответ 3

Еще одна простая опция - указать строку формата.

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

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

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