2013-01-03 123 views
8

根据http://msdn.microsoft.com/en-us/library/6t7dwaa5.aspx,如果我想显示的数作为货币,我可以调用的ToString()和传递参数,在这种情况下“C”Int.ToString(“C”)去除负符号

但是,根据以下MSDN网站的详细信息,它会自动删除减号( - )字符,这意味着我的值现在是正值。

int value = -16325; 
// Display value using default ToString method. 
Console.WriteLine(value.ToString());   // Displays -16325 
// Display value using some standard format specifiers. 
Console.WriteLine(value.ToString("G"));   // Displays -16325 
Console.WriteLine(value.ToString("C"));   // Displays ($16,325.00) 
Console.WriteLine(value.ToString("D"));   // Displays -16325 
Console.WriteLine(value.ToString("F"));   // Displays -16325.00 
Console.WriteLine(value.ToString("N"));   // Displays -16,325.00 
Console.WriteLine(value.ToString("X"));   // Displays FFFFC03B 

所以,我怎么把它用减号,我将不得不使用包含(“ - ”)方法,如果这是真的添加 - 重新打开。

类似这样的代码(道歉,如果它的编码不正确,但你明白了)。

string x = (value.ToString().Contains("-") : "-" + value.ToString("C") ? + value.ToString("C")); 
+0

如果您将“ - ”替换为“(...)”,如MSDN所述,它是正确的,它取决于用户在Windows控制面板中的区域设置,如果用户想要看到(而不是减去为什么重写他/她的设置? –

+3

**括号**在应用程序的当前文化中说是否定的 –

+0

@DavidePiras - 在这种情况下,软件必须设置在远程服务器上,该服务器必须位于我们的“主”软件运行,我的应用程序只是一个补充;尽管每个人都会说英语,但为了账目,它必须显示或不显示! – Dave

回答

12

这取决于您的CurrentCulture.NumberFormat.CurrencyNegativePattern的值。可能的值从0 - 15:

0 : ($12,345.00) 
1 : -$12,345.00 
2 : $-12,345.00 
3 : $12,345.00- 
4 : (12,345.00$) 
5 : -12,345.00$ 
6 : 12,345.00-$ 
7 : 12,345.00$- 
8 : -12,345.00 $ 
9 : -$ 12,345.00 
10 : 12,345.00 $- 
11 : $ 12,345.00- 
12 : $ -12,345.00 
13 : 12,345.00- $ 
14 : ($ 12,345.00) 
15 : (12,345.00 $) 

所以它看起来像你想将它设置为1得到输出你的东西,如后:

int value = -12345; 

var numberFormat = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone(); 
numberFormat.CurrencyNegativePattern = 1; 

string numberAsCurrency = value.ToString("C", numberFormat) 

虽然,根据您的意见关于它是远程服务器,并且您总是希望以特定方式格式化,将整个线程的文化设置为受控值可能会更好,并且这将影响该线程上的所有后续ToString()调用:

int value = -12345; 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); 
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyNegativePattern = 1; 
string numberAsCurrency = value.ToString("C"); 
3

这取决于机器的本地化设置。在许多地区的负面货币表示为(amount)因此.net在这里使用。我不知道如何覆盖这个。但这就是这里发生的事情。

+0

谢谢你提供这些信息。 – Dave

3

这取决于文化。它使用NumberFormatInfo.CurrencyNegativePattern - 在美国似乎使用括号来表示负数。 (正数不会有括号。)

所以,你可以克隆您当前CultureInfo,并改变相关NumberFormatInfoCurrencyNegativePattern - 但我会警惕这样做的。一般来说,您应该相信.NET使用的文化信息适合于该文化。您需要决定是否想要是一种文化特定的表示形式,当然 - 如果没有,您可能需要使用不变式文化。

+0

我同意改变它可能会产生负面影响,但在我的情况下,它只是一个非常小的报告,只要我们的目标利润高于或低于该值即可显示!再次谢谢你! – Dave

1

您可以使用此:

string text = value < 0 ? "-" + (-value).ToString("C") : value.ToString("C"); 

但要确保本地化设置不会改变,以防止无法预料的结果(如 - $ 1.00)

+0

现在你有' - (123.45)' –

+0

我知道。编辑! – Willem

3

你可能想尝试了这一点

 Console.WriteLine((-1234).ToString("c")); 
     CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; 
     CultureInfo newCulture = new CultureInfo(currentCulture.IetfLanguageTag); 
     newCulture.NumberFormat.CurrencyNegativePattern = 1; 
     Thread.CurrentThread.CurrentCulture = newCulture; 
     Console.WriteLine((-1234).ToString("c")); 

MSDN:NumberFormatInfo.CurrencyNegativePattern Property了解详情...

7

您可以从当前的语言环境创建自定义NumberFormatInfo。然后,你可以指定它的CurrencyNegativePattern,例如:

int value = -16325; 
var culture = CultureInfo.CurrentCulture; 
var mutableNfi = (NumberFormatInfo)culture.NumberFormat.Clone(); 
mutableNfi.CurrencyNegativePattern = 1; 
Console.WriteLine(value.ToString("C", mutableNfi)); // Displays (-$16,325.00) 
0

您可以使用此方法来获取货币字符串,并且只有当它是括号,删除括号并添加一个“ - ”。

private string ToCurrencyString(decimal amount) 
{ 
    string c = amount.ToString("C"); 
    if (c.StartsWith("(") && c.EndsWith(")")) 
    { 
     c = "-" + c.SubString(1, c.Length - 2); 
    } 
    return c; 
} 
+0

这不是改变这种情况的方法。 .NET Framework中的格式取决于特定的文化。 –

+0

@WouterdeKort你能解释为什么你认为它不起作用吗? OP意识到文化依赖性,但会明确像删除括号并添加' - ',那么它怎么不是一个解决方案呢? – Rotem

+0

因为有更多优雅的解决方案。如果文化变为一种不使用(),但是[]的文化,那么当Tim Schmelter的解决方案总能正常工作时,你的代码会突然崩溃。 –