2012-06-08 5 views
0

У меня есть следующий метод расширениякультурно нейтральной TryParse

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

Я хочу, чтобы это быть культурно нейтральной позволяет передать $, €, ¥ и т.д. в методе

Благодарности

+0

, что проблема с этим ?? –

+0

Возможно, вам стоит попробовать использовать «CultureInfo.InvariantCulture» вместо передачи определенной «CultureInfo» – V4Vendetta

+0

Pranay Rana. Возможно, я не знаю, в какой валюте я имею дело все время, поэтому я хочу иметь возможность передавать любую форму валюты в метод не только GB £, как показано выше. – burrows

ответ

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

+1 для «Различные культуры могут использовать один и тот же символ валюты для обозначения разных вещей». –

+0

Огромное спасибо, это именно то, что я искал, спасибо – burrows

+0

@burrows Если это правильно, есть ли шанс, что вы могли бы отметить ответ правильно? Просто нажмите галочку рядом с ответом :) – Lukazoid

1

Моя первоначальная мысль заключается в том, что передача символа валюты в такой метод без контекста означает, что он может быть допустимым символом, но необязательно правильно указать один из многих регионов, например, символ «$».

Если бы я делал это в любом случае, я бы, вероятно, обходил конкретные культуры .NET (избегая инвариантной культуры, если вы в Windows 7), проверяя каждое свойство CurrencySymbol RegionInfo на переданную строку. быстрый, грязный (и непроверенный), пока он все еще в моей голове; Я уверен, что это может быть более эффективно закодировано:

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

Это предполагает, что вы только переходящую в символе, и не решает вариант использует различные символы. Надеюсь, тебе все равно придется думать.

+0

Вместо того, чтобы создавать новую' RegionInfo', не будет ли она эквивалентна вызову 'c.NumberFormat.CurrencySymbol'? – Lukazoid

+1

Вы правы - нет причин, по которым вы не могли этого сделать в этом контексте. В случае моей реализации мне необходимо убедиться, что информация, полученная в каждом регионе, не зависит от культуры пользователя (http://forums.asp.net/t/1093381.aspx), поскольку мы показываем элементы в нескольких валютах, но при этом используется форматирование номера текущей культуры. –

+0

Это имеет смысл, я много не делал с культурами и глобализацией, поэтому ссылка и ваше объяснение были очень полезны, спасибо :) – Lukazoid

Смежные вопросы