代码之家  ›  专栏  ›  技术社区  ›  MadBoy

用C将任何货币转换成十进制的最佳方法是什么?

  •  2
  • MadBoy  · 技术社区  · 16 年前

    用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 :

    CultureInfo.GetCultureInfo("pl-PL") 对于ZL,或 CultureInfo.GetCultureInfo("en-GB") 英镑?

    编辑:

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

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

    但说实话,我不太喜欢。

    4 回复  |  直到 12 年前
        1
  •  2
  •   Will A    16 年前

    我不想用decimal.typarse解析货币,而是去掉货币-将结果字符串赋给typarse。单独处理货币-当然,如果您需要多次处理货币,请创建一个函数来执行此操作。

        2
  •  1
  •   Ioannis Karadimas    16 年前

    以下是我的工作,我希望它也能帮助您:

        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;
        }
    
        3
  •  0
  •   SouthShoreAK    12 年前

    我用混合方法解决了这个问题。忽略句点、逗号、括号(在我的例子中,我知道负数在括号中)和数字的regex相当简单。用它来找到你的象征,然后从中建立一种文化。然后解析。

    //[^\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);
    
        4
  •  0
  •   user3638588    12 年前

    今天我遇到了这个问题,结果我只是在所有的文化中循环,并将每个文化传递到胰蛋白酶功能。

    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
    
    推荐文章