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カルチャをループして(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 に答える