2016-03-15 140 views
2

我有一個函數:自定義貨幣格式

string FormatCurrency(string currencyCode, decimal amount) 

例子:

Input: "USD", 1230.56 
Output: "USD 1,230.56" 

Input: "USD", 1230.00 
Output: "USD 1,230" 

Input: "VND", 1200000 
Output: "1.200.000 VND" 

我想參加文化格式(與代碼,而不是符號)和自定義格式(「#,# ###「)。 我該如何執行? 感謝

我的代碼,我在網上看到:

CultureInfo culture = (from c in CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
         let r = new RegionInfo(c.LCID) 
         where r != null 
         && r.ISOCurrencySymbol.ToUpper() == currencyCode.ToUpper() 
         select c).FirstOrDefault(); 

if (culture == null) 
{ 
    return amount.ToString("#,##.##"); 
} 

return string.Format(culture, "{0:C2}", amount); 

,但輸出爲 「1,200.00 $」。我預期的結果是「USD 1200」

+0

你能請把你的代碼,你h ave試過這個.. – SarangK

+0

我剛更新了,請檢查! ^^ – Danie

回答

3

一個有點hackish,但你可以這樣做:

CultureInfo culture = (from c in CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
       let r = new RegionInfo(c.LCID) 
       where r != null 
       && r.ISOCurrencySymbol.ToUpper() == currencyCode.ToUpper() 
       select c).FirstOrDefault(); 
if(culture == null) 
{ 
    // fall back to current culture if none is found 
    // you could throw an exception here if that's not supposed to happen 
    culture = CultureInfo.CurrentCulture;    
} 
culture = (CultureInfo)culture.Clone(); 
culture.NumberFormat.CurrencySymbol = currencyCode; 

// Add spaces between the figure and the currency code 
culture.NumberFormat.CurrencyPositivePattern = culture.NumberFormat.CurrencyPositivePattern == 0 ? 2 : 3; 
var cnp = culture.NumberFormat.CurrencyNegativePattern; 
switch(cnp) 
{ 
    case 0: cnp = 14; break; 
    case 1: cnp = 9; break; 
    case 2: cnp = 12; break; 
    case 3: cnp = 11; break; 
    case 4: cnp = 15; break; 
    case 5: cnp = 8; break; 
    case 6: cnp = 13; break; 
    case 7: cnp = 10; break; 
} 
culture.NumberFormat.CurrencyNegativePattern = cnp; 

return amount.ToString("C" + ((amount % 1) == 0?"0":"2"), culture);  

小提琴這裏:https://dotnetfiddle.net/30f7u3

爲:

FormatCurrency("USD", 1230.56M); 
FormatCurrency("USD", 1230.00M); 
FormatCurrency("VND", 1200000M); 

我得到:

USD 1,230.56 
USD 1,230 
1.200.000 VND 
+0

您沒有檢查是否沒有文化發現哪個會引發錯誤。對於否定模式來說,檢查它是否爲0或1是不夠的,對於否定模式有16個案例。 – Caesar

+0

@Caesar說的沒錯,我加了這個問題的評論:-)是的,應該爲負面模式做一個更好的檢查案例,你確實是對的 – Jcl

+0

@Caesar那裏,修正:-) – Jcl

0

有點難看,但財產以後這樣可能會工作,除非你決定使用培養中使用貨幣格式,文化和貨幣格式

var output = String.Format ("{0} {1:### ### ##0.00}",currencyCode,amount) 

var output = amount.ToString ("C"); 
1

我希望這會幫助你。如果我理解正確,你想把所有東西都顯示爲當前的文化,只是你想改變貨幣的顯示方式。

這是基礎知識,你可以自己繼續。

 CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
     culture.NumberFormat.CurrencySymbol = currencyCode; 
     culture.NumberFormat.CurrencyPositivePattern = 2; 

     return string.Format(culture, "{0:C2}", amount); 

結果對我來說是42,55美元。

+0

你的問題有點令人困惑,刪除了小數點分隔符的變化,他沒有提出這個要求,而在編寫貨幣時,當你期望看到另一個貨幣時,它會令人困惑。還需要添加如何不打印小數點,如果他們是零 –

+0

這適用於'美元'和小數。對於'VND',它會在數字前打印'VND',你也需要考慮這個。 – Jcl

+0

(此外,這將只打印根據當前文化的小數分隔符,而不是由貨幣代碼指定的文化) – Jcl