在C#中将任何货币转换为十进制的最佳方法是什么?

时间:2010-07-04 19:05:31

标签: c# .net

在C#中将任何货币转换为十进制的最佳方法是什么?

public static decimal returnDecimalFromCurrency(string dataToCheck) {

  decimal varValue;
  if (!Decimal.TryParse(dataToCheck, NumberStyles.Number | NumberStyles.AllowCurrencySymbol, CultureInfo.CurrentCulture, out varValue)) {
    varValue = decimal.MinValue;
  }
  return varValue;
}

但这只适用于我现有的货币。如果我通过它欧元货币它将不会被转换。

或唯一的方法是始终检查它是什么货币并传递正确的CultureInfo

zl为{p> CultureInfo.GetCultureInfo("pl-PL"),磅为CultureInfo.GetCultureInfo("en-GB")

编辑:

或者这可能是快速的“工作”黑客?

 Decimal.TryParse(dataToCheck.Trim().Replace("zł", "").Replace("€", ""), NumberStyles.Number | NumberStyles.AllowCurrencySymbol, CultureInfo.GetCultureInfo("pl-PL"), out varValue)

但说实话,我真的不喜欢它。

4 个答案:

答案 0 :(得分:2)

我会避免尝试使用Decimal.TryParse解析货币,而是剥离货币 - 将结果字符串提供给TryParse。单独处理货币 - 当然,如果您需要多次执行此操作,请创建一个功能。

答案 1 :(得分:1)

这对我有用,我希望它对你也有帮助:

    public static decimal Parse(string currencyString)
    {
        return Parse(currencyString, Thread.CurrentThread.CurrentCulture);
    }

    public static decimal Parse(string currencyString, CultureInfo culture)
    {
        currencyString = currencyString.Replace(culture.NumberFormat.CurrencySymbol, System.String.Empty);
        var value = Convert.ToDecimal(currencyString, culture);
        return value;
    }

答案 2 :(得分:0)

我用混合方法解决了同样的问题。正则表达式忽略句点,逗号,括号(在我的情况下,我知道负数在括号中),数字相当简单。只需使用它来找到你的符号,然后从中建立一种文化。然后解析。

//[^\d\.,()]+ all non-digit, non-period, non-comma, non-parenthesis chars
var regex = new Regex("[^\\d\\.,()]+");
var match = regex.Match(currencyString);

if(match == null){ //throw exception }

var currencySymbol = match.Value;

var cultureInfo = Thread.CurrentThread.CurrentCulture.Clone() as CultureInfo;
cultureInfo.NumberFormat.CurrencySymbol = currencySymbol;

var decimalValue = Decimal.Parse(currencyString, NumberStyles.Currency, cultureInfo);

答案 3 :(得分:0)

我今天遇到了这个问题,最后我只是循环遍历所有文化,并将每个文化传递给TryParse函数。

var myString = "$400.01";
var result = 0.0m;

var culture = System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.AllCultures)
    .First(c => decimal.TryParse(myString, System.Globalization.NumberStyles.Currency, c, out value))

// result = 400.01m