if OBJECT_ID('GetDecimal') is not null
drop function GetDecimal
go
create function [dbo].[GetDecimal_D](
@value varchar(20), --处理的值
@decimalPlace int --小数位
) returns varchar(20)
as
/***************************************
--功能:小数位保留(如果保留的数为0,自动查找下一位)
--创建人:zhujt
--创建日期:2012-11-28 14:23:34
***************************************/
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), --小数部分
@decimalPartC varchar(10),--小数部分
@current int=0, --当前位置
@next int, --下一位的值
@j int=1, --循环变量
@power decimal(18,10)=1, --平方
@savePard decimal(18,10), --保留部分
@flag int=0
--小数点位置
set @index=charindex('.',@result)
--处理的值带有小数
if @index>0
begin
--获取整数部分
set @integerPart=substring(@result,1,@index-1)
--获取小数部分
set @decimalPart=substring(@result,@index+1,len(@result)-@index)
--获取保留小数位数值
set @current=substring(@decimalPart,@decimalPlace,1)
--获取下一位的值
set @next=substring(@decimalPart,@decimalPlace+1,1)
--如果处理值是小于1的值
if @integerPart='0'
begin
if @next>=5 --当前位置大于0
begin
while @j<=@decimalPlace
begin
set @power=@power*0.1
set @j+=1
end
set @savePard='0.'+substring(@decimalPart,1,@decimalPlace)
set @result=@savePard+@power
end
else
begin
set @decimalPartC=substring(@decimalPart,1,@decimalPlace)
if @current>0 --如果当前值大于0
begin
set @savePard='0.'+substring(@decimalPart,1,@decimalPlace)
set @result=@savePard
end
else if @current=0 and @decimalPartC=0 --如果当前值等于0
begin
while @j<=LEN(@decimalPart)
begin
set @power=@power*0.1
if @j>=@decimalPlace+1
begin
set @current=@next --当前位置
set @next=substring(@decimalPart,@j,1) --下一位置
if @next>0
begin
set @flag=1
break
end
end
set @j+=1
end
--如果下一位大于0
if @flag=1
begin
set @savePard='0.'+substring(@decimalPart,1,@j)
set @next=substring(@decimalPart,@j+1,1)
if @next>5
set @result=@savePard+@power
else set @result=@savePard
end
else
begin
set @savePard='0.'+substring(@decimalPart,1,@decimalPlace)
set @result=@savePard
end
end
else if @current=0 and @decimalPartC>0
begin
set @savePard='0.'+substring(@decimalPart,1,@decimalPlace)
set @result=@savePard
end
end
end
else --如果处理值是大于等于1的值
begin
if @next>=5
begin
while @j<=@decimalPlace
begin
set @power=@power*0.1
set @j+=1
end
set @savePard='0.'+substring(@decimalPart,1,@decimalPlace)
set @result=@integerPart+@savePard+@power
end
else
begin
set @savePard='0.'+substring(@decimalPart,1,@decimalPlace)
set @result=@integerPart+@savePard
end
end
--小数点位数
set @j=len(@result)-@index
--去除后面多余的0
while @decimalPlace<@j and right(@result,1)='0'
begin
set @result=left(@result,len(@result)-1)
set @j=len(substring(@result,@index+1,len(@result)-@index))
end
if left(@result,len(@result))='.'
set @result+='0'
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