如何在 C# 中将任何货币格式转换为 "de-de"

How to get any currency format to be converted into "de-de" in C#

我从一个网站获取货币值...它们可以是 任何 货币格式,因为该网站在多个国家/地区是不同的。

我目前拥有的:

var actualPriceString = actualPriceElement.Text;
var actualPriceDe = Convert.ToDecimal(actualPriceString).ToString("C0", CultureInfo.GetCultureInfo("de-de"));
var maxPriceDe = Convert.ToDecimal(product.Max_Price).ToString("C0", CultureInfo.GetCultureInfo("de-de"));

if (Convert.ToDecimal(actualPriceDe) <= Convert.ToDecimal(maxPriceDe))
  run = await ClickElement(_config.site.add_to_cart, driver);

这只会给我错误,或者根本不是我想要的。

转换为十进制时出现错误:

exception.Message = "Input string was not in a correct format."

货币格式可能如下所示: 3.399,00 或 3,399.00

我也试过在线查找结果,但我得到的只是从一种货币格式到任何其他格式...

感谢您的帮助!

你不能解决一般情况的问题,但是,我们可以争取一些限制情况:

  1. 我们假设负值使用简单的前导--123.456,78
  2. 我们假设美分的仓位不超过 2
  3. 我们假设小数分隔符和组分隔符不混合:12,45,67 == 123456
  4. 我们忽略货币符号,所有金额均假定为欧元

代码:

public static decimal MyConversion(string value) {
  if (string.IsNullOrWhiteSpace(value))
    throw new FormatException("Not a valid currency");

  value = string.Concat(value
    .Reverse()
    .SkipWhile(c => !char.IsDigit(c))
    .Reverse()
    .SkipWhile(c => !char.IsDigit(c) && c != '-'));

  HashSet<char> separators = new HashSet<char>();
  int suggestSeparatorIndex = -1;

  StringBuilder sb = new StringBuilder(value.Length);

  for (int i = 0; i < value.Length; ++i) {
    char c = value[i];

    if (char.IsDigit(c))
      sb.Append(c);
    else if (c == '-' && i == 0)
      sb.Append(c);
    else if (!char.IsWhiteSpace(c)) 
      if (separators.Add(c))
        suggestSeparatorIndex = sb.Length;
      else
        suggestSeparatorIndex = -1;
  }

  if (suggestSeparatorIndex >= 0 && suggestSeparatorIndex >= sb.Length - 2)
    sb.Insert(suggestSeparatorIndex, '.');

  return decimal.Parse(sb.ToString(), CultureInfo.InvariantCulture) + 0.00m;
}

演示:

  string[] tests = new string[] {
    "3.399,00", 
    "3,399.00",
    "123,345,789.0",
    "123.1",
    "12.23.45", // here '.' is a group separator
    "123",
    "456 $ 89 cents", // we ignore $ here, no currency exchange will be done
    ".89",
    "123=35 (euro)",
    "56 Евро 89 центов", // Russian, stands for 56 Euro 89 cents
  };

  // Deutschland Kultur (German Culture settings)
  CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("de-De");

  string report = string.Join(Environment.NewLine, tests
    .Select(test => $"{test,25} => {MyConversion(test)}"));

  Console.Write(report);

结果:

             3.399,00 => 3399,00
             3,399.00 => 3399,00
        123,345,789.0 => 123345789,00
                123.1 => 123,10
             12.23.45 => 122345,00
                  123 => 123,00
       456 $ 89 cents => 456,89
               .89 => 56,89
        123=35 (euro) => 123,35
    56 Евро 89 центов => 56,89