2015-08-06 3 views
1

Мы сохраняем таблицу основных данных в SQL, которая содержит код валюты, описание и символ всех валют, в которые наша компания ведет бизнес. Всего имеется 32. Пример;Есть ли способ сопоставить код валюты ISO обратно в строку культуры?

USD, Доллар США, $

Эти коды используются для поиска информации курсовую, которая автоматически вставляется в другую таблицу SQL. Все наши приложения .NET поддерживают эти валюты. Пользователь устанавливает свою привилегированную валюту в своем профиле.

Мы только недавно начали использовать элементы управления Telerik, а элемент управления RadNumericTextBox берет строку культуры как свойство (т.е. en-US), которая обрабатывает все специфические для культуры настройки (символ, разделитель, группировка и т. Д.), Что делает денежный ввод довольно приятным для пользователя, но это создает проблему.

Теперь актуальная проблема. Я связываю выпадающий список со списком объектов, и для того, чтобы иметь всю необходимую информацию для контроля telerik и информации об обменном курсе, базовые значения должны быть в этом формате. Пример;

: -> EN-US: USD

Logic, который строит валюта объекты

public static List<Currency> BuildCurrencyObjects() 
    { 
     List<Currency> currencies = new List<Currency>(); 
     List<Currency> dbCurrencies = CurrencyMgmt.GetCurrencies(); 

     foreach (Currency currency in dbCurrencies) 
     { 
      var region = CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
            .Select(c => new RegionInfo(c.LCID)) 
            .Where(ri => ri != null && ri.ISOCurrencySymbol == currency.CurrenyCode) 
            .FirstOrDefault(); 

      if (region != null) 
      { 
       var culture = CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
             .Where(x => x.Name.EndsWith((region as RegionInfo).Name)) 
             .FirstOrDefault(); 
       if (culture != null) 
       { 
        Currency c = new Currency() 
        { 
         CultureCode = culture.Name + ":" + region.ISOCurrencySymbol, 
         Symbol = culture.NumberFormat.CurrencySymbol, 
         Description = region.CurrencyEnglishName, 
         CurrencyRegion = region.EnglishName, 
         CurrenyCode = region.Name 
        }; 

        currencies.Add(c); 
       } 
      } 
     } 

     return currencies; 
    } 

Я написал эту функцию довольно быстро, и оказалось, чтобы работать правильно. Он создает 31 объект валюты и отображает то, что казалось правильным текстом в раскрывающемся списке. Я только осознал, что возникла проблема, когда она была перенесена в нашу тестовую среду, в которой шел текст из Соединенных Штатов; и значение;

США, доллар США, $ -> Карибы, доллар США, $ ан-США: USD -> ан-029: USD

теперь я понимаю, что вышеуказанная логика не будет работать, так как есть несколько культур, которые возвращаются к коду валюты, а Linq возвращает первый элемент в последовательности. Есть ли какой-либо умный способ привязать код валюты к строке культуры?

ответ

0

Короткий ответ: невозможно. Посмотрите, что произойдет с ЕВРО. Вы можете увидеть еще примеры here

Ваше решение должно включать способ хранения фактической культуры вместе с валютой.

+0

Я обсуждал сохранение кода культуры в базе данных, но на данный момент, поскольку это был только код ISO, который давал мне проблемы; Я добавил немного Linq, который возвращает объект Region с GeoID США. Не самое изящное решение, но на данный момент оно выполняется. Я вернусь к этому, когда он перейдет к производству в глобальном масштабе. – Mikolz

0

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