SQL 小数位保留,如果不够保留位数,自动添加0

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值