格式化SQL Server数据库中的十进制值

时间:2011-07-27 17:51:43

标签: c# sql-server decimal

我正在使用现有的SQL Server数据库,其表列定义为decimal(4,2)。但是,我被要求阻止代码舍入小数位。

所以我尝试将列类型更改为decimal,它会自动转换为decimal(18, 0),这会立即清除现有值的任何小数部分。 (很好。默认的十进制类型是一个整数。重点是什么?)

所以我尝试将列类型更改为decimal(8,5)。由于十进制之后的5位数超过了需要,因此消除了舍入问题。

但是,每当我在C#ASP.NET应用程序中打印此值时,它总是以十进制后的5位数格式化(例如12.34000)。我不明白这一点。当我从数据库中读取值时,我将其分配给常规decimal值。那么decimal值如何“知道”小数点后应该有5位数?

更重要的是,如何在没有尾随零的情况下显示此值?我猜有一种格式化值的方法。但是,由于它在许多地方使用,如果它不会自动附加尾随零,会好得多。如果需要,我可以更改数据库中的数据类型。

5 个答案:

答案 0 :(得分:3)

我将数据库列更改为float,并将C#变量类型设置为double

问题解决了。

答案 1 :(得分:2)

您应该考虑在表示层而不是数据层中格式化您的货币。 通常,您希望将货币值存储在十进制(10,18)字段中。您可以检索十进制值并将其格式化为csharp中的表示,如str = String.Format(“{0:C}”,myDecimalValue);

答案 2 :(得分:1)

十进制将始终以尾随零返回。按照惯例 - 尾随零表示有效位数。

在您的情况下,十进制(8,5)表示该数字总共有8位数,其中5位在小数点后面。

试试此Select CAST (1 as decimal (8, 5))将返回1.00000

由于这意味着小数点前只有3位数,因此以下语句Select CAST (1000 as decimal (8, 5))会给您一个错误Arithmetic overflow error converting int to data type numeric.

答案 3 :(得分:1)

在控制台应用中尝试这个小片段:

decimal d1 = 12.34M, d2 = 12.3400M;

Console.WriteLine("{0} {1}", d1, d2);
Console.WriteLine("{0:0.0###} {1:0.0###}", d1, d2);

如果,您可以如何以及在何处应用格式取决于您。

答案 4 :(得分:0)

实体框架默认使用decimal(18,2)。如果你不告诉它,它不会格式化以适应 SQL Server 数据类型。

要告诉 EF 应该为每个属性执行什么 SQL 数据类型:

public class DbEntities : DbContext {
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<Location>().Property(location => location.Latitude).HasPrecision(9, 6);
    }
}

还有其他方法可以为所有属性执行此操作:Decimal precision and scale in EF Code First