Сообщений 5    Оценка 195        Оценить  
Система Orphus

Классы для преобразования чисел в русские числительные

Вариант для .NET

Автор: Виталий Брусенцев
The RSDN Group
Опубликовано: 22.07.2002
Исправлено: 13.03.2005
Версия текста: 1.1

Класс RSDN.RusCurrency
Метод Str
Метод Register
Пример использования
Регистрация валют в config-файлах
Класс RSDN.RusNumber
Метод Str
Метод Case

Исходный файл (C#)

Существует великое множество приложений, которым требуется выводить числа "прописью" – в основном, различные "бухгалтерии" и учетные системы. На форумах RSDN уже приводились реализации такого алгоритма на C++ и VBA. Теперь вам не придется ломать над этим голову и при создании .NET-приложений – достаточно включить в сборку нижеприведенные классы. Я поместил их в пространство имен RSDN.

Класс RSDN.RusCurrency

Универсальный класс для любых валют, основанных на делении старшей единицы на 100 младших. Если валюта подчиняется другим законам, создайте собственный класс на основе RusCurrency.

Позволяет получить строковый эквивалент суммы в выбранной валюте. По умолчанию зарегистрированы 3 валюты: рубли, доллары и евро. Поддерживается регистрация новых валют.

Метод Str

Различные перегруженные варианты метода 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 (например, "Доллар, доллара, долларов. Цент, цента, центов.").

Метод Register

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

Регистрация валют в config-файлах

Класс 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 пфенингов

Класс RSDN.RusNumber

Класс низкого уровня – основа всех преобразований. Используется для каждой группы из трех цифр в методе Str класса RusCurrency. Позволяет правильно "написать" по-русски число от 0 до 999 и правильно склоняет "добавку" – существительное, которое относится к числу. Например, "двадцать пять бананов", но "сто тридцать два банана". Учитывает мужской и женский род.

Я включил этот класс в область видимости лишь потому, что он может кому-нибудь понадобиться для более экзотических преобразований (например, для выражения расстояния в милях, футах и дюймах). Сам по себе он мало пригоден.

Метод Str

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

(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        Оценить