11

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

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

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

我不知道如何处理这个问题。现在,我的解决方法是否定我的负值并获得我string.Format(...)再次做的积极结果。是的,我意识到这前面没有负号,但是,当然,这很容易通过根据需要在结果前面添加“-”来解决。

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

4

6 回答 6

12

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

NumberFormatInfo noParens = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone();
noParens.CurrencyNegativePattern = 1;
double dollarValue = -145d;
string output = dollarValue.ToString("C0", noParens); // outputs -$145
于 2012-06-13T12:51:27.273 回答
3

试试这个...

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

或者

dollarValue.ToString("$#.;-$#.")
于 2012-06-13T12:38:04.963 回答
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);
于 2012-06-13T12:41:56.820 回答
2

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

NumberFormatInfo writeable = (NumberFormatInfo) ni.Clone();
于 2012-06-13T12:43:20.850 回答
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)));

这就是成功。

于 2012-06-13T12:43:52.963 回答
1

为了确保你保持在“美国背景”中,我会做这样的事情:

double val = -145d;
NumberFormatInfo nfi = new CultureInfo("en-US").NumberFormat;
nfi.CurrencyNegativePattern = 1;
val.ToString("C0", nfi).Dump();

来自DumpLinqPad,-$145结果显示。

你得到的错误感觉就像它来自你得到这样的NumberFormatInfo东西:

NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat;

在这种情况下,我会用这样的东西代替:

NumberFormatInfo nfi = (NumberFormatInfo)Thread.CurrentThread.CurrentCulture.NumberFormat.Clone();
于 2012-06-13T12:51:32.237 回答