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

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

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

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

Редактировать 1: Уточнения

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

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

Изменить 2: Цели типа данных Money

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

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

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

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


person Community    schedule 07.02.2010    source источник
comment
Не уверен, что именно вы ищете. Не могли бы вы подробнее рассказать о классе Money или о каких-либо ссылках на идентичный класс на других языках?   -  person Gant    schedule 07.02.2010
comment
Добавлен Edit к вопросу - Money class означает тип данных Money в .NET. Может быть, класс C #, или класс VB.NET, или аналогичная структура.   -  person John K    schedule 07.02.2010
comment
Обычно при работе с деньгами / валютой всегда используется десятичная дробь, чтобы избежать проблем с округлением, вызванных типами данных с плавающей запятой. Я до сих пор не вижу надежных вариантов использования Money Class, которые вам нужны, кроме конвертации валюты, поддержки конкретного округления обменов, ... первое из которых может быть выполнено с помощью веб-службы, как это было предложено @Kazar.   -  person Gant    schedule 07.02.2010
comment
@ m3rLinEz: вариант использования - это любое приложение, осуществляющее денежные операции. Запрос на выделенный тип данных в духе инкапсуляции и абстракции для использования во многих различных приложениях, которым нужны деньги и их операции в глобальном контексте. Также для получения преимуществ типа данных, таких как ремонтопригодность, возможность повторного использования, тестируемость и т. Д. Ищете абстракцию более высокого уровня, чем вы могли бы подумать - конечно, веб-сервисы в конечном итоге могут быть использованы для получения информации о валютном курсе, но сначала я хочу, чтобы абстракция денег поддерживала те.   -  person John K    schedule 07.02.2010
comment
Проблема, которую я вижу с идеей класса Money, - это та же проблема, что и у нас с часовыми поясами: правила все время меняются. На самом деле, это хуже, чем это - по крайней мере, с данными даты / времени у нас есть эталонный часовой пояс, UTC, тогда как валюты все плавают друг относительно друга. Все внешние зависимости, связанные с единицей валюты, делают ее плохим выбором для инкапсуляции; действительно, валюта - это просто десятичная дробь с фиксированной точкой с прикрепленным кодом региона; любые более сложные функции будут в лучшем случае ненадежными.   -  person Aaronaught    schedule 07.02.2010
comment
@Aaronaught: Есть и другие преимущества, такие как защита от умножения двух сумм в разных валютах. Это всего лишь один.   -  person John K    schedule 07.02.2010
comment
stackoverflow.com/questions/274296/money-type   -  person Mauricio Scheffer    schedule 07.02.2010
comment
moneytype.codeplex.com   -  person Mauricio Scheffer    schedule 07.02.2010
comment
michaelbrumm.com/money.html   -  person Mauricio Scheffer    schedule 07.02.2010
comment
@Mauricio: Спасибо, отличные ссылки. CLR / Money набирает обороты.   -  person John K    schedule 07.02.2010


Ответы (8)


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

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

person waheed    schedule 07.02.2010
comment
Фаулер использует целочисленный тип для представления общей суммы центов в денежной сумме вместо десятичного типа для представления суммы в долларах с оставшимися центами. - person John K; 07.02.2010
comment
Я написал парсер журнала для MMO, и он отслеживал все монеты, которые вы собирали на протяжении всего игрового процесса. Было несколько номиналов монет, но, в конце концов, было легче отслеживать все украденные деньги, исходя из наименее оцененной монеты (меди). Это позволяет относительно легко выполнять операции с этими деньгами, и вам не нужно беспокоиться об ошибках округления. - person mmcdole; 12.02.2010
comment
Считая деньги целыми числами, например decimal 3.58 as int 358 центов подойдет, если вам не нужно иметь дело со строгой финансовой информацией, требующей сохранения долей центов (например, денежные рынки, торговля и т. д.). Количество денег внутри хорошо подходит для простых денежных потребностей, таких как розничная торговля. - person John K; 18.02.2010
comment
Это правильно, и целочисленная проблема тоже легко решается. Я разработал собственный класс Number неограниченной длины, который похож на BigInteger, но с десятичными знаками и полными математическими возможностями. Я согласен, что специального денежного класса не требуется, только бизнес-логика и помощники по форматированию, например. Конечно, вам все равно нужно сохранить имя валюты где-нибудь в классе / структуре контейнера (например, бизнес-объект, заказ). Неправильно пытаться хранить всю информацию о валюте в каждой сумме, даже только название валюты, потому что это пустая трата памяти / нагрузки. - person Tony Wall; 16.01.2014

Тип данных Money @ The Code Project

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

Автор заявляет об аналогичной проблеме:

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

и выполняет цели

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

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

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

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

person John K    schedule 07.02.2010
comment
Выглядит хорошо. И это пролило свет на меня, какие операции должны выполняться в классе Money. - person Gant; 07.02.2010

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

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

person Community    schedule 09.11.2015

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

person user268005    schedule 07.02.2010
comment
Я удивлен, потому что моя первая реакция была такой: вероятно, существует множество вариантов для такой вещи. Если ни один из ответов не дает подходящего готового решения, мне, возможно, придется сделать то, что вы говорите. На самом деле, черт возьми, уже начали. - person John K; 07.02.2010

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

person Eric Hauser    schedule 07.02.2010
comment
Это приятно, потому что синтаксис Java относительно легко перенести на C #, а заимствование концепций полезно, как было предложено. - person John K; 07.02.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

Таким образом, выводится обменный курс фунта стерлингов в евро.

person Alistair Evans    schedule 07.02.2010
comment
Это интересно и может содержать некоторые полезные финансовые расчеты, однако я ищу отдельный денежный класс для использования в качестве типа данных. Я просмотрел исходный код финансовой библиотеки и не нашел ничего, только функции. Конечно, возможно, это потому, что я недостаточно хорошо понимаю F # - дайте мне знать, действительно ли класс там. - person John K; 07.02.2010

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

person Community    schedule 20.10.2010

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

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

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

person Gant    schedule 07.02.2010
comment
Это впечатляющая библиотека, и она поддерживает тип данных Money, хотя .NET напрямую не поддерживается. В FAQ сказано: 7.2. Поддерживает ли QuantLib .NET? Не прямо. Однако привязки C # для QuantLib доступны; см. страницу расширений. - Quantlib.org/faq.shtml Конечно, есть способы привязать его к .NET, но лично я не уверен в этом механизме привязки SWIG, который предлагает заставить его работать swig. sourceforge.net - person John K; 07.02.2010