2013-01-03 128 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的解決方案總能正常工作時,你的代碼會突然崩潰。 –