#c# #asp.net-mvc-3 #entity-framework-4
#c# #asp.net-mvc-3 #entity-framework-4
Вопрос:
У меня в базе данных есть таблица с денежным полем. Я создал entity и создал свойство decimal для этого поля money. Когда значение этого поля отображается в моем представлении MVC3, оно имеет четыре нуля 0000 после десятичного знака, например: 5489.0000. Я хочу показать только два знака 00 или после запятой. Как я могу это исправить. Почему он показывает четыре знака после запятой, даже если я объявил свойство как десятичное.
Пожалуйста, предложите.
Ответ №1:
Тип данных SQL Server money
внутренне представляет собой 64-разрядное целое число с подразумеваемой шкалой в 4 знака после запятой. Чтобы цитировать книги онлайн, это с точностью «до десяти тысяч единиц денежной единицы». Это грубый эквивалент decimal(19,4)
.
Причиной использования шкалы 4, а не 2, является поддержание точности результатов арифметических вычислений. Значение вашей обычной валюты имеет масштаб 2 (например, 3,27 доллара). Умножение или деление двух чисел, уменьшенных до 2 знаков после запятой, дает результат с точностью до 4 знаков после запятой: 9,23, разделенное на 3,27, дает результат 2,82262996941896 (приблизительно). Вы можете перенести результат с любой точностью (количество знаков после запятой), которое вы пожелаете. Однако результат является только точным с точностью до 4 знаков после запятой (2.8226), поскольку исходные значения были точными только с точностью до 2 знаков после запятой. Это измерение выполняется с точностью до 1/2 от наименьшей указанной единицы ( /- 0,005).
Но я отвлекся.
В результате того, что значение SQL Server money
имеет подразумеваемый масштаб 4, ADO.Net преобразует значение в систему.Десятичная дробь со шкалой 4. И начиная с System.Десятичные треки масштабируются, когда вы преобразуете их в строку, вы получаете 4 знака после запятой.
Чтобы получить меньше, вы можете
- Округлите его перед преобразованием, используя соответствующую
Decimal.Round()
перегрузку, или - Отформатируйте его по желанию (например.
(3.27M).ToString("0.00") ;
.
Надеюсь, это поможет.
Эта программа:
namespace Sandbox
{
using System ;
class Program
{
static void Main( string[] args )
{
decimal pi = (decimal) Math.PI ;
string piText = pi.ToString("0.00");
Console.WriteLine("PI to 2 decimal places is {0} one way, and {1:0.00} another" , piText , pi ) ;
return;
}
}
}
Выдает то, что вы ожидаете:
PI to 2 decimal places is 3.14 one way, and 3.14 another
Приветствия,
N.
Комментарии:
1. Я использую десятичное число? и toString(«0:00) не могут быть использованы с ним
2. Кто-нибудь должен сказать это . Чистая среда выполнения. Смотрите пример в моем первоначальном ответе.
3. Форматирование не работает в компонентах DevExpress. Которые полны ошибок, подобных этому, кстати.
Ответ №2:
Вы должны отформатировать строку.
Единственное, что вы можете сделать, если хотите отобразить деньги, это:
static void Main ()
{
decimal x = 0.999m;
decimal y = 9999999999999999999999999999m;
Console.WriteLine("My amount = {0:C}", x);
Console.WriteLine("Your amount = {0:C}", y);
}
}
ВЫВОД: Вывод
Моя сумма = $ 1,00
Ваша сумма = $ 9,999,999,999,999,999,999,999,999.00
{0:C} — это формат валюты
Надеюсь, это поможет!
Комментарии:
1. Привет @Nico: Я не хочу ставить $ с суммой. Как я могу изменить string.format(«{0:C}»,amount)?
2. можно было бы сказать, что десятичное число dec = 5489,0000M; dec. toString(«0.00»);
Ответ №3:
Вот все, что вам нужно знать о форматировании строк.
Ответ №4:
Я использовал это, и это сработало:
YourDecField.ToString("N")