




Я думаю, вы хотите использовать десятичный тип данных и использовать соответствующую перегрузку для Нанизывать().
CultureInfo current = CultureInfo.CurrentCulture;
decimal myMoney = 99.99m;
//formats as money in current culture, like $99.99
string formattedMoney = myMoney.ToString("C", current);
А как насчет валюты, отличной от той, которая используется в нынешней культуре?
да ... убедитесь, что вы используете десятичный тип для денег. Float НЕ подходит для десятичных значений.
Проверьте эту статью Тип денег для CLR
A convenient, high-performance money structure for the CLR which handles arithmetic operations, currency types, formatting, and careful distribution and rounding without loss.
Очень интересно. Это помогло бы в моем прошлом проекте.
У него есть проблемы: (1) Я видел много случаев, когда равные значения Money не приравниваются к равным, и вам нужно сначала привести к десятичному виду. (2) Он очень толстый: он содержит: Int64, Int32, 3 строки и UInt16. Автор не понимал природы десятичного типа. (3) Хеш-функция довольно неоптимальна. (4) У вас могут быть дробные центы (это нормально), но ToString () округляет до двух десятичных знаков.
В отношении (1) я должен был сказать, что видел случай, когда два равных значения Money не приравнивались как равные (внутреннее значение одного из них не было нормализовано должным образом).
Пока я каталогизирую проблемы: (5) Он имеет неявное преобразование из double, что опасно (у decimal этого нет). (6) IConvertible.ToBoolean инвертируется (0 преобразуется в истину). (7) Неподдерживаемые преобразования IConvertible вызывают NotSupportedException, а не InvalidCastException в соответствии со спецификацией.
(8) MoneyDistributer имеет только 3 модульных теста. Это заставляет меня нервничать, потому что есть много непроверенных случаев.
Я бы использовал целое число / длинный и использовал бы очень низкий номинал, например центы (или пенсы) - тогда не было бы десятичной дроби, с которой можно было бы работать, и все вычисления можно было бы округлить до ближайшего цента.
или взгляните на книгу Мартина Фаулера «Шаблоны архитектуры корпоративных приложений». В этой книге он рассказал о том, как реализовать денежный класс. http://www.amazon.com/Enterprise-Application-Architecture-Addison-Wesley-Signature/dp/0321127420
У вас здесь что-то не так. Это не очень низкий номинал, это самый низкий номинал. Это единственный непонятный ответ, который я когда-либо находил - если у вас есть точность, превосходящая реальность, вы получите дроби, перенесенные после делений, которые не должны переноситься.
Однако цент - не самый низкий номинал американской валюты; в противном случае заправочные станции не смогли бы продавать газ по цене 2,149 доллара за галлон, что они и делают. Точно так же проценты (например, проценты) часто приводят к дробным центам, и округление не всегда уместно на промежуточных этапах.
Интересно, что этот вопрос был закрыт, так как он является дубликатом вопроса новее. Как это работает, вы меня поймали.