if OBJECT_ID('GetDecimal') is not null drop function GetDecimalgocreate function [dbo].[GetDecimal]( @value varchar(20), --处理的值 @decimalPlace int --小数位 ) returns varchar(20)as /***************************************--功能:小数位保留 如果保留的小数位是0,自动查找非0数字--创建人:zhujt--创建日期:2012-11-22 10:11:09***************************************/begin declare @result varchar(20) --显示结果 if @value is not null begin --处理的值含有'L' if charindex('L',@value)>0 set @result=cast(convert(decimal(18,8),replace(@value,'L',''))/2 as varchar) --处理的值含有'e' else if charindex('e',@value)>0 or charindex('E',@value)>0 set @result=cast(convert(decimal(18,8),convert(float,@value)) as varchar) else set @[email protected] declare @index int, --小数点位置 @integerPart varchar(10),--整数部分 @decimalPart varchar(10)--小数部分 --小数点位置 set @index=charindex('.',@result) --处理的值带有小数 if @index>0 begin --获取整数部分 set @integerPart=substring(@result,1,@index) --获取小数部分 set @decimalPart=substring(@result,@index+1,len(@result)[email protected]) --如果小数部分长度大于保留小数位数 if len(@decimalPart)>@decimalPlace begin declare @savePard float --保留部分 set @savePard=convert(float,'0.'+substring(@decimalPart,1,@decimalPlace)) if @savePard>0 --保留部分>0 begin if convert(int,substring(@decimalPart,@decimalPlace+1,1))>=5 --如果下一位≥5 begin declare @k int=1, --下标 @power float=1 --平方 while @k<[email protected] begin set @[email protected]*0.1 set @k+=1 end set @result=convert(varchar(20),@integerPart+convert(decimal(18,8),(@[email protected]))) while charindex('.',@result)>0 and right(@result,1)='0' set @result=left(@result,len(@result)-1) if right(@result,1)='.' set @[email protected]+'0' end else --如果<5 set @[email protected][email protected] if charindex('.',@result)=0 begin declare @m int=1 set @result+='.' while @m<[email protected] begin set @result+='0' set @m+=1 end end else set @result=substring(@result,1,charindex('.',@result)[email protected]) end else if @savePard=0--保留部分=0 begin declare @intPos int=0, -->0的数的位置 @next int, --下一位的值 @n int=1, --循环变量 @power1 float=1 --平方 while @intPos<=len(@decimalPart) begin set @intPos+=1 if substring(@decimalPart,@intPos,1)<>'0' begin set @next=substring(@decimalPart,@intPos+1,1) break end end set @savePard=convert(float,'0.'+substring(@decimalPart,1,@intPos)) if @next>=5 begin while @n<[email protected] begin set @[email protected]*0.1 set @n+=1 end set @result=convert(varchar(20),@integerPart+convert(decimal(18,8),(@[email protected]))) end else set @result=convert(varchar(20),@integerPart+convert(decimal(18,8),@savePard)) while charindex('.',@result)>0 and right(@result,1)='0' set @result=left(@result,len(@result)-1) if right(@result,1)='.' set @[email protected]+'0' end end else if len(@decimalPart)<@decimalPlace --如果小数部分<保留小数位数 begin declare @j int=1 while @j<[email protected](@decimalPart) begin set @decimalPart+='0' set @j+=1 end set @[email protected][email protected] end end else --如果没有小数位 begin set @result+='.' declare @i int=1 while @i<= @decimalPlace begin set @result+='0' set @i+=1 end end end else set @[email protected] return @resultend
详细解决方案
SQL 小数位保存,如果不够保留位数,自动添加0
热度:79 发布时间:2016-05-05 12:53:45.0
相关解决方案