SQL:小数位保留(如果保留的数为0,自动查找下一位)

本文介绍了一个SQL函数GetDecimal_D,用于保留指定小数位数并处理特殊数值格式。该函数能够处理包含‘L’、‘e’或‘E’的输入,并能智能判断是否需要进位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值