Кто-нибудь знает о типе денег в .NET?

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

Интересно, что этот вопрос был закрыт, так как он является дубликатом вопроса новее. Как это работает, вы меня поймали.

Mateo 12.11.2012 00:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
1
22 591
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, вы хотите использовать десятичный тип данных и использовать соответствующую перегрузку для Нанизывать().

CultureInfo current  = CultureInfo.CurrentCulture;
decimal myMoney = 99.99m;

//formats as money in current culture, like $99.99
string formattedMoney = myMoney.ToString("C", current); 

А как насчет валюты, отличной от той, которая используется в нынешней культуре?

DarkWanderer 12.10.2014 13:57

да ... убедитесь, что вы используете десятичный тип для денег. Float НЕ подходит для десятичных значений.

Armstrongest 08.11.2008 07:55
Ответ принят как подходящий

Проверьте эту статью Тип денег для CLR

A convenient, high-performance money structure for the CLR which handles arithmetic operations, currency types, formatting, and careful distribution and rounding without loss.

Очень интересно. Это помогло бы в моем прошлом проекте.

Jason Jackson 08.11.2008 07:01

У него есть проблемы: (1) Я видел много случаев, когда равные значения Money не приравниваются к равным, и вам нужно сначала привести к десятичному виду. (2) Он очень толстый: он содержит: Int64, Int32, 3 строки и UInt16. Автор не понимал природы десятичного типа. (3) Хеш-функция довольно неоптимальна. (4) У вас могут быть дробные центы (это нормально), но ToString () округляет до двух десятичных знаков.

dan-gph 04.01.2012 11:40

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

dan-gph 05.01.2012 07:36

Пока я каталогизирую проблемы: (5) Он имеет неявное преобразование из double, что опасно (у decimal этого нет). (6) IConvertible.ToBoolean инвертируется (0 преобразуется в истину). (7) Неподдерживаемые преобразования IConvertible вызывают NotSupportedException, а не InvalidCastException в соответствии со спецификацией.

dan-gph 05.01.2012 09:30

(8) MoneyDistributer имеет только 3 модульных теста. Это заставляет меня нервничать, потому что есть много непроверенных случаев.

dan-gph 05.01.2012 09:42

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

или взгляните на книгу Мартина Фаулера «Шаблоны архитектуры корпоративных приложений». В этой книге он рассказал о том, как реализовать денежный класс. http://www.amazon.com/Enterprise-Application-Architecture-Addison-Wesley-Signature/dp/0321127420

У вас здесь что-то не так. Это не очень низкий номинал, это самый низкий номинал. Это единственный непонятный ответ, который я когда-либо находил - если у вас есть точность, превосходящая реальность, вы получите дроби, перенесенные после делений, которые не должны переноситься.

Loren Pechtel 08.11.2008 09:38

Однако цент - не самый низкий номинал американской валюты; в противном случае заправочные станции не смогли бы продавать газ по цене 2,149 доллара за галлон, что они и делают. Точно так же проценты (например, проценты) часто приводят к дробным центам, и округление не всегда уместно на промежуточных этапах.

technophile 08.11.2008 21:58

Другие вопросы по теме