2016-03-15 57 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, \“]”,“”)') –