Сообщений 5 Оценка 195 Оценить |
Существует великое множество приложений, которым требуется выводить числа "прописью" – в основном, различные "бухгалтерии" и учетные системы. На форумах RSDN уже приводились реализации такого алгоритма на C++ и VBA. Теперь вам не придется ломать над этим голову и при создании .NET-приложений – достаточно включить в сборку нижеприведенные классы. Я поместил их в пространство имен RSDN.
Универсальный класс для любых валют, основанных на делении старшей единицы на 100 младших. Если валюта подчиняется другим законам, создайте собственный класс на основе RusCurrency.
Позволяет получить строковый эквивалент суммы в выбранной валюте. По умолчанию зарегистрированы 3 валюты: рубли, доллары и евро. Поддерживается регистрация новых валют.
Различные перегруженные варианты метода Str возвращают строковое представление числа в разных валютах. Диапазон допустимых значений числа – от –999*1015 до 999*1015 (короче говоря, триллиард туда-сюда – выразить государственный внешний долг РФ хватит).
public static string Str(double val); |
Возвращает для числа val правильно сформированную строку в рублях.
public static string Str(double val, string currency); |
Возвращает для числа val правильно сформированную строку в валюте с обозначением currency (например, "RUR", "USD" или "EUR"). Если такой вид валюты не зарегистрирован в классе, будет выброшено исключение System.ArgumentOutOfRangeException.
public static string Str(double val, bool male, string seniorOne, string seniorTwo, string seniorFive, string juniorOne, string juniorTwo, string juniorFive) |
Выводит строку в определенной денежной единице (без предварительной регистрации). Вы сами должны задать правильные грамматические формы. Параметр male определяет род (мужской или женский) старшей денежной единицы (например, для доллара male=true). При задании следующих шести параметров (в нижнем регистре!) просто проговаривайте про себя существительные для чисел 1, 2 и 5 (например, "Доллар, доллара, долларов. Цент, цента, центов.").
public static void Register(string currency, bool male, string seniorOne, string seniorTwo, string seniorFive, string juniorOne, string juniorTwo, string juniorFive); |
Регистрирует новый тип валюты. В строке currency указывается обозначение валюты (банковское или какое вам удобнее). Остальные параметры указываются так же, как и в предыдущем методе.
Раз уж у нас есть Common Language Runtime, грех этим не воспользоваться. Приведу пример вывода числа на JScript.NET:
//jsc /r:RusNumber.dll TestNumerics.js import System; import RSDN; try { var t:double = 2351656.04; //выводим сумму в рублях Console.WriteLine("{0} р. = {1}", t, RusCurrency.Str(t) ); //выводим ее же в валюте "USD" Console.WriteLine("${0} = {1}", t, RusCurrency.Str(t, "USD")); //регистрируем новую валюту - британский фунт стерлингов (GBP) RusCurrency.Register("GBP", true, "фунт", "фунта", "фунтов", "пенс", "пенса", "пенсов"); Console.WriteLine("#{0} = {1}", t, RusCurrency.Str(t, "GBP")); //пытаемся вызвать незарегистрированную валюту - казахские тенге Console.WriteLine("{0} = {1}", t, RusCurrency.Str(t, "KZT")); } catch(e) { Console.WriteLine(e); } |
Результат:
2351656,04 р. = Два миллиона триста пятьдесят одна тысяча шестьсот пятьдесят шесть рублей 04 копейки $2351656,04 = Два миллиона триста пятьдесят одна тысяча шестьсот пятьдесят шесть долларов 04 цента #2351656,04 = Два миллиона триста пятьдесят одна тысяча шестьсот пятьдесят шесть фунтов 04 пенса Error: Валюта "KZT" не зарегистрирована Parameter name: currency |
Класс RSDN.RusCurrency поддерживает также указание необходимого перечня валют в стандартных конфигурационных xml-файлах приложений для .NET (спасибо Андрею Корявченко – за идею и помощь в реализации).
Такой config-файл должен содержать описание специальной конфигурационной секции <currency-names> в разделе <configuration>. Далее в теле файла эта секция может содержать один или несколько узлов <currency> с описанием атрибутов валюты, как показано на листинге 2.
<?xml version="1.0" encoding="windows-1251"?> <configuration> <configSections> <section name="currency-names" type="RSDN.RusCurrencySectionHandler, RusNumber"/> </configSections> <currency-names> <currency code="DM" male="0"> <senior one="марка" two="марки" five="марок"/> <junior one="пфенинг" two="пфенинга" five="пфенингов"/> </currency> </currency-names> </configuration> |
Если дать такому файлу имя вида Application.exe.config, где Application.exe – имя вашего приложения, то при инициализации класса RusCurrency автоматически зарегистрируется перечисленный список валют.
Вот пример использования автоматической регистрации валют:
//csc /r:RusNumber.dll TestNumerics.cs using System; using RSDN; class TestApp { static void Main() { double d=31322821.27; Console.WriteLine("{0} = {1}", d, RusCurrency.Str(d, "DM")); } }; |
Результат:
31322821,27 = Тридцать один миллион триста двадцать две тысячи восемьсот двадцать одна марка 27 пфенингов |
Класс низкого уровня – основа всех преобразований. Используется для каждой группы из трех цифр в методе Str класса RusCurrency. Позволяет правильно "написать" по-русски число от 0 до 999 и правильно склоняет "добавку" – существительное, которое относится к числу. Например, "двадцать пять бананов", но "сто тридцать два банана". Учитывает мужской и женский род.
Я включил этот класс в область видимости лишь потому, что он может кому-нибудь понадобиться для более экзотических преобразований (например, для выражения расстояния в милях, футах и дюймах). Сам по себе он мало пригоден.
public static string Str(int val, bool male, string one, string two, string five) |
Преобразует в строку переданное значение val. Род указывается параметром male (true – мужской; false – женский). Параметры one, two и five, соответственно, должны содержать существительное в правильных падежах для чисел 1, 2 и 5.
Пример:
return RusNumber.Str(233, true, "гвоздь", "гвоздя", "гвоздей"); |
(case (грам. англ.) – падеж). Используется для склонения существительного в зависимости от количества. Предназначен для использования в классах RusCurrency и RusNumber.
public static string Case(int val, string one, string two, string five) |
Возвращает одну из строк (one, two или five) в зависимости от значения val.
Пример:
return RusNumber.Case(233, "гвоздь", "гвоздя", "гвоздей"); |
Сообщений 5 Оценка 195 Оценить |