if OBJECT_ID('GetDecimal') is not null
drop function GetDecimal
go
create 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 @result=@value
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)-@index)
--如果小数部分长度大于保留小数位数
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<=@decimalPlace
begin
set @power=@power*0.1
set @k+=1
end
set @result=convert(varchar(20),@integerPart+convert(decimal(18,8),(@savePard+@power)))
while charindex('.',@result)>0 and right(@result,1)='0'
set @result=left(@result,len(@result)-1)
if right(@result,1)='.' set @result=@result+'0'
end
else --如果<5
set @result=@integerPart+@savePard
if charindex('.',@result)=0
begin
declare @m int=1
set @result+='.'
while @m<=@decimalPlace
begin
set @result+='0'
set @m+=1
end
end
else
set @result=substring(@result,1,charindex('.',@result)+1+@decimalPlace)
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<=@intPos
begin
set @power1=@power1*0.1
set @n+=1
end
set @result=convert(varchar(20),@integerPart+convert(decimal(18,8),(@savePard+@power1)))
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 @result=@result+'0'
end
end
else if len(@decimalPart)<@decimalPlace --如果小数部分<保留小数位数
begin
declare @j int=1
while @j<=@decimalPlace-len(@decimalPart)
begin
set @decimalPart+='0'
set @j+=1
end
set @result=@integerPart+@decimalPart
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 @result=@value
return @result
end
SQL 小数位保留,如果不够保留位数,自动添加0
最新推荐文章于 2023-11-21 15:36:58 发布