0

我有以下扩展方法

public static bool IsValidCurrency(this string value)
{
    CultureInfo culture = new CultureInfo ("en-gb");
    decimal result;
    return decimal.TryParse(value, NumberStyles.Currency, culture, out result);
}

我希望这在文化上是中立的,允许将 $ 、 €、 ¥ 等传递到方法中

谢谢

4

2 回答 2

2

不同的文化可能使用相同的货币符号来表示不同的事物。因此,没有不变的方式来读取货币。

然而,它可以通过以下方式完成:

public static bool IsValidCurrency(this string value)
{       
    decimal result;
    var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
    return cultures.Any(info => Decimal.TryParse(value, NumberStyles.Currency, info, out result));
}
于 2012-06-08T11:58:07.763 回答
1

我最初的想法是,在没有上下文的情况下将货币符号传递给这种方法意味着它可能是一个有效的符号,但不一定是正确的——例如,许多地区使用“$”符号。

如果我仍然这样做,我可能会循环特定的 .NET 文化(避免使用 Invariant Culture,如果您使用的是 Windows 7),根据传入的字符串检查每个 RegionInfo 的 CurrencySymbol 属性。这很快,很脏(并且未经测试),而它仍在我的脑海中;我相信这可以更有效地编码:

public static Boolean IsValidCurrency(this string value)
{
  // Assume the worst.
  Boolean isValid = false;

  foreach (CultureInfo c in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
  {
    // Account for InvariantCulture weirdness in Windows 7.
    if (!c.Equals(CultureInfo.InvariantCulture))
    {
      RegionInfo r = new RegionInfo(c.LCID);

      if (r.CurrencySymbol.Equals(value, StringComparison.OrdinalIgnoreCase))
      {
        // We've got a match, so flag it and break.
        isValid = true;
        break;
      }
    }
  }

  return isValid;
}

这假设您只传递符号,并没有解决不同符号的变体使用。无论如何,希望这能让你思考。

于 2012-06-08T11:56:22.853 回答