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

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

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

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

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

现在,根据我的研究,可以使用NumberFormatInfo类来完成此操作。 我无法弄清楚如何使用它,我找不到任何有效的例子。 我确实在这里看到了这个问题: 当货币值为0.00美元时,C#创建一个自定义的NumberFormatInfo来显示“Free”但是来自这个问题的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”exception。 虽然CurrencyNegativePattern属性的“文档”说你可以设置和获取值,但显然你不能。 此外,NumberFormatInfo是一个密封类。 我不能轻易地创建一个基于它的新类并覆盖该值。

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

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

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

您可以在CurrentCulture复制NumberFormat属性(这将确保在CurrentCulture化应用程序时保留正确的货币符号)。 之后,只需将CurrencyNegativePattern属性设置为所需的值,并在double.ToString()函数中传入NumberFormatInfo ,如下所示:

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