Вопрос по .net, iformatprovider, c#, globalization – Как использовать NumberFormatInfo для удаления круглых скобок для отрицательных значений

11

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

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 в этой ситуации? Благодарю.

У меня работает код (после исправления дела наNumberformatInfo) James Hill
Вы уверены, что ошибка возникает из-за установки CurrencyNegativePattern экземпляра NumberFormatInfo? Я видел это исключение только для чтения, но оно вызвано попыткой изменить свойства CurrentUICulture? Tisho

Ваш Ответ

6   ответов
1

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

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

и это успех.

1

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

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

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

NumberFormatInfo writeable = (NumberFormatInfo) ni.
3

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

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

или же

dollarValue.ToString("$#.;-$#.")
Исправлен формат @Jeppe .... спасибо за улов ... и мне нравится ваш второй вариант немного лучше ... изменился, чтобы отразить это.
И, конечно же,string.Format("{0:$#.;-$#.}", dollarValue) эквивалентноdollarValue.ToString("$#.;-$#.") так же, какstring.Format("{0:C0}", dollarValue) эквивалентноdollarValue.ToString("C0").
Вам нужно поменять местами$ и-.
2
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);
И здесьthe doc.
@MMK спасибо за ваш ответ. Я думаю, что в вашем коде отсутствует часть, то есть часть, в которой вы указываете & quot; number.CurrencyNegativePattern = 1 & quot; для того, чтобы удалить скобки. Смотрите этот ответ:stackoverflow.com/a/11015234/2816119
Хорошо, ответ NumberFormatInfo, который вы предоставили, работает, если я установлю значение CurrencyNegativePattern равным 1. Это также правильно устанавливает символ валюты, который не установлен должным образом, если я не использую эту культуру. Хорошая работа. Dan7el
проверьте отредактированный ответ, пожалуйста.
Я попробовал этот ответ в консольном приложении для тестирования, и результат составил ($ 145). Если бы я использовал & quot; C & quot; вместо «0: C0» за формат я получил ($ 145,00). Dan7el
11

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

Похожие вопросы