Здравый смысл при хранении валюты? - PullRequest
4 голосов
/ 27 сентября 2011

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

Вся хранимая валюта конвертируется в валюту приложения, скажем, EUR (€), и при выводе, валюта конвертируется обратно в собственную валюту пользователя с обновленным обменным курсом дня?

Какой здесь здравый смысл?Как это вообще решается и что я должен знать, прежде чем выбрать способ справиться с этим?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

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

См. Образец денег в книге Мартина Фаулера «Архитектура корпоративных приложений».

Фаулер описывает определение простого типа данных для хранения двух примитивных компонентов с перегруженными арифметическими операторами для выполнения денежных операций:

"Основная идея состоит в том, чтобы иметь класс Money с полями для числового значениясумма и валюта. Вы можете хранить сумму как целочисленный тип или фиксированный десятичный тип. Десятичный тип легче для некоторых манипуляций, интегральный для других. Вы должны абсолютно избегать любого типа с плавающей точкой, поскольку это введетпроблемы округления, которых деньги намерены избегать. В большинстве случаев люди хотят, чтобы денежные значения были округлены до наименьшей полной единицы, такой как центы в долларе. Однако бывают моменты, когда требуются дробные единицы.или чтобы уточнить, с какими деньгами вы работаете, особенно в приложении, которое использует оба вида.Имеет смысл иметь разные типы для двух случаев, поскольку в арифметике они ведут себя совершенно по-разному.

Деньги нуждаются в арифметических операциях, чтобы вы могли использовать денежные объекты так же легко, как и числа.Но арифметические операции для денег имеют некоторые важные отличия от денежных операций в числах.Совершенно очевидно, что любое сложение или вычитание должно учитывать валюту, чтобы вы могли реагировать, если попытаетесь сложить вместе деньги разных валют.Самый простой и наиболее распространенный ответ - рассматривать сложение разнородных валют как ошибку.В некоторых более сложных ситуациях вы можете использовать идею Уорда Каннингема о сумке для денег.Это объект, который содержит деньги нескольких валют вместе в одном объекте.Затем этот объект может участвовать в расчетах, как и любой денежный объект.Его также можно оценить в валюте. "

1 голос
/ 27 сентября 2011

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

При обработке денежных величин вы должны учитывать, какой валютой являются реальные деньги. Если фактические деньги указаны в долларах США и вы храните их как евро, при изменении их значений вы получите несоответствие между фактическим значением и сохраненным значением.

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

...