Как использовать NumberFormatInfo для удаления круглых скобок для отрицательных значений

В настоящее время мы используем следующее для создания долларовых ценностей в нашем веб-приложении:

string.Format("{0:C0}", dollarValue );

В этом примере, если dollarValue равно 145, то мы увидим: $145. Если это -145, то мы увидим (145 долларов), а не - 145 долларов. Обратите внимание, что для нас значение DollValue является двойным, но это может быть любой числовой тип. Я думаю.

В любом случае, я хочу, чтобы это было либо 145, либо - 145 долларов.

Теперь, согласно моим исследованиям, это можно сделать с помощью класса NumberFormatInfo. Я не могу понять, как его использовать, и я не могу найти какой-либо действительный пример. Я видел этот вопрос здесь: C# создает пользовательский NumberFormatInfo для отображения "Free", когда значение валюты составляет $0,00, но пример из MSDN, связанный с этим вопросом, кажется немного отличным от того, что я действительно хочу сделать.

Я понимаю, мне нужно будет сделать что-то из следующего:

double dollarValue = -145d;
string myMoney = dollarValue.ToString( "C0", someIFormatProvider );

где someIFormatProvider, скорее всего, имеет тип NumberFormatInfo. Теперь, что я сделал, это:

NumberFormatInfo ni = new NumberformatInfo();
ni.CurrencyNegativePattern = 1; // The value 1 should mean not to use parenthesis
string myMoney = dollarValue.ToString( "C0", ni );

... и я получаю исключение "Экземпляр только для чтения". В то время как в "документации" для свойства CurrencyNegativePattern говорится, что вы можете УСТАНОВИТЬ и ПОЛУЧИТЬ значение, очевидно, вы не можете. Кроме того, NumberFormatInfo является закрытым классом. Я не могу легко создать новый класс на основе этого и переопределить значение.

Я в растерянности относительно того, как бороться с этим. Прямо сейчас мой обходной путь должен просто отрицать мою отрицательную ценность и иметь положительный результат, который я делаю string.Format(...) снова. Да, я понимаю, что перед этим нет никаких отрицательных признаков, но, конечно, это легко решить, добавив "-" перед результатом по мере необходимости.

Кто-нибудь сможет дать мне рабочий пример того, как эффективно использовать класс NumbefFormatInfo в этой ситуации? Благодарю.

6 ответов

Решение
double dollarValue = -145d;
 System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
 string mymoney = dollarValue.ToString("C", modCulture);
          MessageBox.Show(mymoney);

Если ваша текущая культура операционной системы en-US, вам не нужна следующая строка

System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");

Код будет

double dollarValue = -145d;
string mymoney = dollarValue.ToString("C");

и если вы хотите сделать с NumberFormatInfo

double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
     NumberFormatInfo number = modCulture.NumberFormat;
     string mymoney = dollarValue.ToString("C", number);

по-другому

double dollarValue = -145d;
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
NumberFormatInfo number = modCulture.NumberFormat;
string mymoney = dollarValue.ToString(String.Format("C",number));
Console.WriteLine(mymoney);

Вы можете сделать клон из NumberFormat недвижимость в CurrentCulture (это обеспечит сохранение правильного символа валюты, если вы глобализируете свое приложение). После этого просто установите CurrencyNegativePattern собственности до желаемого значения и передать в ваш NumberFormatInfo в double.ToString() функция, вот так:

NumberFormatInfo noParens = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone();
noParens.CurrencyNegativePattern = 1;
double dollarValue = -145d;
string output = dollarValue.ToString("C0", noParens); // outputs -$145

Попробуй это...

string.Format( "{0:$#.;-$#.}", -145 )

или же

dollarValue.ToString("$#.;-$#.")

'instance is ReadOnly' означает, что у вас есть экземпляр только для чтения NumberFormatInfo, Вы можете получить доступный для записи экземпляр, клонируя экземпляр только для чтения:

NumberFormatInfo writeable = (NumberFormatInfo) ni.Clone();

Вы уверены, что CurrencyNegativePattern не может быть назначен? Я пробовал с этим кодом:

double dollarValue = -145d;
System.Globalization.NumberFormatInfo ni = new System.Globalization.NumberFormatInfo();
ni.CurrencyNegativePattern = 1;
dropDownList.Items.Add(new ListItem(dollarValue.ToString("C0", ni)));

и это успех.

Чтобы убедиться, что вы остаетесь в "американском контексте", я бы сделал что-то вроде этого:

double val = -145d;
NumberFormatInfo nfi = new CultureInfo("en-US").NumberFormat;
nfi.CurrencyNegativePattern = 1;
val.ToString("C0", nfi).Dump();

Dump исходит от LinqPad, который отображает -$145 в следствии.

Похоже, ошибка, которую вы получаете, происходит от того, что вы получаете NumberFormatInfo что-то вроде этого:

NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat;

В этом случае я бы заменил что-то вроде этого:

NumberFormatInfo nfi = (NumberFormatInfo)Thread.CurrentThread.CurrentCulture.NumberFormat.Clone();
Другие вопросы по тегам