文化中立的TryParse

本文关键字:TryParse 文化中 | 更新日期: 2023-09-27 18:36:30

>我有以下扩展方法

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

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

谢谢

文化中立的TryParse

不同的文化可能使用相同的货币符号来表示不同的东西。因此,没有固定的方法来读取货币。

但是,可以通过以下方式完成:

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));
}

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

如果我无论如何都要这样做,我可能会循环特定的 .NET 区域性(如果您使用的是 Windows 7,则避免使用固定区域性),根据传入的字符串检查每个 RegionInformation 的 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;
}

这假设您只传入符号,并不能解决不同符号的变体用法。无论如何,希望这能引起您的思考。