два знака после запятой для поля decimal / money

#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:

Вот все, что вам нужно знать о форматировании строк.

http://blog.stevex.net/string-formatting-in-csharp/

Ответ №4:

Я использовал это, и это сработало:

 YourDecField.ToString("N")