2016-03-15 84 views
1

我特地到多個SO問題上解析貨幣,最好的(推薦)的方式似乎是一個我想下面:與貨幣符號解析值

var payout = decimal.Parse("$2.10", NumberStyles.Currency | NumberStyles.AllowDecimalPoint); 

然而,拋出和異常:輸入字符串的格式不正確。

我不知道我在做什麼錯?

編輯

感謝您的答案。附加信息:我給出的硬編碼貨幣價值僅僅是一個例子。我有貨幣的列表:

€2,66

$ 2.10

$ 5.55

我不能事先確定的文化信息。有任何想法嗎?

+3

移到另一個國家(使用$作爲貨幣符號和'.'作爲小數點分隔符)。或者閱讀'CultureInfo',因爲它可能更便宜。 –

+0

貨幣字符串將是動態的,不像我的示例那樣硬編碼。例如。 2.10美元,2,66歐元等。我如何提前瞭解CultureInfo? – l3utterfly

+0

跑掉......沒有用於格式化CultureInfo的知識,沒有辦法正確解析$ 3,100。檢查所有貨幣符號列表並希望您正確猜測了小數點分隔符是最安全的賭注(我不會推薦這麼做)。 –

回答

2

類似的方法@作爲答案的人提到聯合國幸運,我試圖使它通用和工作的每一個Symbol/Format

public static decimal ParseCurrencyWithSymbol(string input) 
{ 
    var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures) 
     .GroupBy(c=> c.NumberFormat.CurrencySymbol) 
     .ToDictionary(c=> c.Key, c=>c.First()); 


    var culture = cultures.FirstOrDefault(c=>input.Contains(c.Key)); 

    decimal result = 0; 
    if(!culture.Equals(default(KeyValuePair<string,CultureInfo>))) 
    { 
     result = decimal.Parse(input, NumberStyles.Currency | NumberStyles.AllowDecimalPoint, culture.Value); 
    } 
    else 
    { 
     if(!decimal.TryParse(input, out result)) 
     { 
      throw new Exception("Invalid number format"); 
     } 
    } 

    return result; 
} 

使用

decimal output = ParseCurrencyWithSymbol("$2.10"); 

工作Code

+0

使用歐元,您的代碼輸出210,這是錯誤的,因爲在歐盟,「逗號」是小數點分隔符,而不是「期間」 – l3utterfly

+0

@ l3utterfly ahh ..沒有注意到,感謝指點。將解決它。 –

+0

@ l3utterfly修復它。 –

0

有關您的特定情況下,你可以使用下面的代碼片段:

var payout = decimal.Parse("$2.10".Replace("$","")); 

如果你不知道貨幣符號是什麼,那麼請嘗試以下解決方案:

string _money = "$2.10"; 
var payout = decimal.Parse(_money.Substring(1)); 

處理逗號和小數點要困難得多:如果這是問題,請參閱member @ un-lucky提供的解決方案。

希望這可能有所幫助。

+0

真的沒有什麼會幫助OP :) ...尤其是這個代碼並不是每個地方都把貨幣符號放在前面。 –

+0

@AlexeiLevenkov是的,我同意。這個問題太廣泛,不確定性太多。問候, –

1

你可以嘗試這樣的:

decimal currencyValue; 
string inputCurrency = "$12.6"; 
if (decimal.TryParse(inputCurrency, NumberStyles.Currency, CultureInfo.CreateSpecificCulture("en-US"), out currencyValue)) 
    { 
     // proceed with currencyValue 
    } 
else 
    { 
     //Show error ; Conversion failed 
    } 

對於處理所有的貨幣,你可以使用以下命令:

 Dictionary<char, string> currencyCulture = new Dictionary<char, string>(); 
     currencyCulture.Add('$', "en-US"); 
     currencyCulture.Add('€', "en-IE"); 
     // populate all posible values here 
     decimal currencyValue; 
     string inputCurrency = "€2,66"; 
     char currencySymbol= inputCurrency.ToCharArray()[0]; 
     CultureInfo currentCulture= CultureInfo.CreateSpecificCulture(currencyCulture[currencySymbol]); 
     if (decimal.TryParse(inputCurrency, NumberStyles.Currency, currentCulture, out currencyValue)) 
     { 
      // proceed with currencyValue 
     } 
     else 
     { 
     //Show error ; Conversion failed 
     } 

您可以從here

0

選擇文化名怎麼樣CleanCurrency方法?

/// Loops each char in the string and returns only numbers, . or , 
static double? CleanCurrency(string currencyStringIn) { 
    string temp = ""; 
    int n; 
    for (int i = 0; i < currencyStringIn.Length; i++) { 
    string c = currencyStringIn.Substring(i, 1); 
    if (int.TryParse(c, out n) || c == "." || c == ",") { 
     temp += c; 
    } 
    } 
    if (temp == "") { 
    return null; 
    else { 
    return double.Parse("0" + temp); 
    } 
} 

這裏的想法是隻是得到一個實際的數字,不管字符串內容是什麼。

double? payout = CleanCurrency("$3.50"); 
+0

它呢?這裏的想法是「1,500」和「1.500」是非常不同的值 - 沒有解釋你的代碼如何解決這個問題(除了一些非常複雜的實現'Regex.Replace(「$ 1.2」,@「[^ \ d, \「]」,「」)') –