文化中立的TryParse

时间:2012-06-08 11:30:34

标签: c#

我有以下扩展方法

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

我希望这个文化中立,允许将$,€,¥等传递给方法

由于

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:1)

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

如果我这样做的话,我可能会围绕特定的.NET文化(如果你在Windows 7上避免使用Invariant Culture),请根据传入的字符串检查每个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;
}

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