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

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

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

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

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

Теперь, согласно моим исследованиям, возможно сделать это с помощью класса NumberFormatInfo. Я не могу понять, как его использовать, и я не могу найти ни одного действительного примера. Я видел этот вопрос здесь:C # создание пользовательского NumberFormatInfo для отображения & quot; Свободного & quot; когда значение валюты составляет 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 );

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

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

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

 James Hill13 июн. 2012 г., 14:40
У меня работает код (после исправления дела наNumberformatInfo)
 Tisho13 июн. 2012 г., 14:38
Вы уверены, что ошибка возникает из-за установки CurrencyNegativePattern экземпляра NumberFormatInfo? Я видел это исключение только для чтения, но оно вызвано попыткой изменить свойства CurrentUICulture?

Ответы на вопрос(6)

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
 Dan7el13 июн. 2012 г., 15:44
Интересно. Спасибо, это сработало. Я рад видеть, что я не слишком далек от общей реализации. Я просто не знал, что мне нужно это клонировать.
 13 июн. 2012 г., 16:11
Это также позволит вам использовать текущую культуру, поэтому вам не нужно жестко кодировать ее в «en-US». в случае, если вы в конечном итоге глобализации вашего веб-приложения.

что вы остаетесь в «американском контексте» Я бы сделал что-то вроде этого:

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

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

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

и это успех.

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

NumberFormatInfo writeable = (NumberFormatInfo) ni.

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

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

или же

dollarValue.ToString("$#.;-$#.")
 13 июн. 2012 г., 14:46
Исправлен формат @Jeppe .... спасибо за улов ... и мне нравится ваш второй вариант немного лучше ... изменился, чтобы отразить это.
 13 июн. 2012 г., 14:46
И, конечно же,string.Format("{0:$#.;-$#.}", dollarValue) эквивалентноdollarValue.ToString("$#.;-$#.") так же, какstring.Format("{0:C0}", dollarValue) эквивалентноdollarValue.ToString("C0").
 13 июн. 2012 г., 14:42
Вам нужно поменять местами$ и-.
Решение Вопроса
double dollarValue = -145d;
 System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
 string mymoney = dollarValue.ToString("C", modCulture);
          MessageBox.Show(mymoney);

вам не нужна следующая строка

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);
 13 июн. 2012 г., 14:53
И здесьthe doc.
 28 авг. 2018 г., 21:12
@MMK спасибо за ваш ответ. Я думаю, что в вашем коде отсутствует часть, то есть часть, в которой вы указываете & quot; number.CurrencyNegativePattern = 1 & quot; для того, чтобы удалить скобки. Смотрите этот ответ:stackoverflow.com/a/11015234/2816119
 Dan7el13 июн. 2012 г., 16:09
Хорошо, ответ NumberFormatInfo, который вы предоставили, работает, если я установлю значение CurrencyNegativePattern равным 1. Это также правильно устанавливает символ валюты, который не установлен должным образом, если я не использую эту культуру. Хорошая работа.
 13 июн. 2012 г., 15:43
проверьте отредактированный ответ, пожалуйста.
 Dan7el13 июн. 2012 г., 15:39
Я попробовал этот ответ в консольном приложении для тестирования, и результат составил ($ 145). Если бы я использовал & quot; C & quot; вместо «0: C0» за формат я получил ($ 145,00).

Ваш ответ на вопрос