SQL:小数位保留(如果保留的数为0,自动查找下一位)
[sql] www.2cto.com
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) --下一位置