Как использовать 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();