Тип данных денег для .NET? - PullRequest
       16

Тип данных денег для .NET?

35 голосов
/ 07 февраля 2010

В поисках хорошего типа данных Money для .NET, который поддерживает валюты и курсы обмена (с соответствующим поведением и операциями).

  • Примечание: Я начал искать исходный код, увиденный в печати в книге Разработка через тестирование на примере от автора Кента Бека - он разрабатывает хорошую монетарную концепцию. Невозможно найти полный источник в Интернете. Книга не содержит единственного списка - вместо этого она разрабатывает исходный код на протяжении всей книги.

Хотя книга не углубляется, я также хотел бы, чтобы класс Money поддерживал различные механизмы округления , потому что это также различается в финансовых учреждениях по всему миру.

Редактировать 1: Пояснения

Под «классом денег» я подразумеваю тип данных .NET, который я могу использовать для поддержки денег и их операций, в комплекте с поддержкой валют и расчетами обменного курса. Нечто подобное является абстракцией более высокого уровня и может внутренне использовать примитивный тип данных. Также он может полагаться на набор классов, таких как: Money, ExchangeRate, Bank и т. Д.

Это может быть тип значения (то есть структура) или ссылочный тип (то есть класс), но в любом случае он будет завершен и будет поддерживать вышеупомянутые функции.

Редактировать 2: тип данных Цели денег

(Это также показывает, почему необработанный десятичный, int или другой примитивный тип не подходит для всех потребностей в деньгах)

Цели типа данных Money будут:

  • Функции безопасности (то есть предотвращение арифметики для разных типов валют).
  • Сохраните тип валюты со значением (то есть AUD, US, DKK).
  • Сохранять данные форматирования (то есть, десятичную группировку, символы валюты и т. Д.).
  • Конверсионные провайдеры (например, обменный курс), чтобы помочь завершить решение.
  • Сокращение нескольких валют в выражении для достижения результата.

Примечание: Различные значения данных, такие как обменные курсы, могут быть загружены из внешнего источника и использованы. Этот вопрос не выводит ничего динамического, жестко запрограммированного в понятии денег.

Ответы [ 8 ]

9 голосов
/ 07 февраля 2010

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

Модель количества и денег Мартина Фаулера

5 голосов
/ 07 февраля 2010

Тип данных денег @ Код проекта

http://www.codeproject.com/KB/vb/moneyDatatype.aspx

Автор констатирует похожую проблему:

как часть недавней заявки I понял, как не хватает .NET для валютная поддержка, не поймите меня неправильно, есть много "кусочков" но клей для всех предметов отсутствует , так что это статья является ответом на это.

и выполняет задачи

Моими основными целями стали

  • Сохраните тип валюты со значением (то есть AUD, US, DKK).
  • Хранить данные форматирования (то есть, десятичная группировка, символы валюты, и др.).
  • Поставщики конверсий, я не хотел жестко кодировать это, так как это тип данных а не решение.
  • Особенности безопасности разработки (т.е. предотвращение арифметики на разных типы валют).

Пока что это самый близкий .NET-код к тому, что я ищу. Он соответствует большинству требований денег.

Если у кого-то есть что-то лучше, это будет высоко ценится.

4 голосов
/ 09 ноября 2015

NodaMoney предоставляет библиотеку, которая рассматривает деньги как первоклассного гражданина в .NET и обрабатывает все уродливые биты, такие как валюты и форматирование.

Это соответствует валютам в ISO 4217. И это .NET-аналог java библиотеки JodaMoney.

2 голосов
/ 20 октября 2010

Я являюсь автором NMoneys , который, я думаю, может пригодиться. Он еще не был "официально выпущен", но пока мало что изменится.

2 голосов
/ 07 февраля 2010

Если вы ищете шаблоны, вы можете проверить Joda Money . Это Java, но он должен дать вам некоторые идеи по API. Реализация на C # была бы гораздо менее многословной из-за перегрузки операторов.

2 голосов
/ 07 февраля 2010

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

1 голос
/ 07 февраля 2010

Посмотрите здесь:

http://blogs.msdn.com/lucabol/archive/2008/12/04/financial-functions-for-net-released.aspx

Предоставляет библиотеку .NET, воспроизводящую все финансовые функции Excel.

Конвертировать валюту сложно, потому что, очевидно, она постоянно меняется, поэтому жестко закодированные значения будут более или менее бесполезны. Тем не менее, вы можете использовать веб-сервис для доступа к актуальным обменным курсам. Этот выглядит как хорошее начало. Более того, интерфейс в стиле REST для того же конвертера:

http://www.webservicex.com/CurrencyConvertor.asmx/ConversionRate?FromCurrency=GBP&ToCurrency=EUR

Так, что выводит курс конвертации фунтов стерлингов в евро.

0 голосов
/ 07 февраля 2010

Я понимаю ваши замечания о преимуществах наличия слоя абстракции над деньгами. Однако мой взгляд на деньги и их «операции» довольно размыт. Для других вещей, таких как File, для меня ясно, что должны быть операции Open, Read, Write, Close. Но за деньги я не могу думать о многом другом, кроме основных математических операций (+, -, *, /)

В одной из библиотек C ++ по количественным финансам, которые я знаю, есть эта абстракция Money (http://quantlib.org/reference/class_quant_lib_1_1_money.html.)). Но вы можете ясно видеть, что это очень тонкая оболочка, которая обеспечивает базовые перегрузки операторов и преобразование единиц в десятичное число.

В большинстве случаев я думаю, что десятичное число может удовлетворить ваше требование. Если вам нужна какая-то конкретная операция с деньгами, я думаю, что все в порядке, чтобы развернуть ваши собственные классы.

...