如何使用NumberFormatInfo删除负值的括号

时间:2012-06-13 12:32:20

标签: c# .net globalization iformatprovider

我们目前正在使用以下内容在我们的网络应用程序中创建美元价值:

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

在这个例子中,如果dollarValue是145,那么我们将看到:145美元。如果它是-145,那么我们将看到(145美元)而不是 - 145美元。请注意,对于我们来说,dollarValue是一个double,但它可以是任何数字类型。我想。

无论如何,我想要的是145美元或145美元。

现在,根据我的研究,使用NumberFormatInfo类可能会这样做。我无法弄清楚如何使用它,我找不到任何有效的例子。我确实在这里看到了这个问题:C# creating a custom NumberFormatInfo to display "Free" when a currency value is $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 );

...我得到一个“Instance is Read-Only”异常。虽然CurrencyNegativePattern属性的“文档”说你可以设置和获取值,但显然你不能。此外,NumberFormatInfo是一个密封类。我不能轻易地创建一个基于它的新类并覆盖该值。

我对如何处理这件事感到茫然。现在,我的解决方法是只是否定我的负面价值,并得到一个积极的结果,我再次string.Format(...)。是的,我意识到前面没有负面的迹象,但是,当然,根据需要在结果前添加“ - ”可以很容易地解决这个问题。

有人能够在这种情况下为我提供一个如何正确有效地使用NumbefFormatInfo类的工作示例吗?感谢。

6 个答案:

答案 0 :(得分:12)

您可以在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

答案 1 :(得分:3)

试试这个......

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

'instance is ReadOnly'表示您拥有NumberFormatInfo的只读实例。您可以通过克隆只读实例来获取可写实例:

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

答案 4 :(得分:1)

您确定MoneyNegativePattern无法分配吗?我尝试过这段代码:

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

并取得了成功。

答案 5 :(得分: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();