10進制轉33進制

1,開始

 昨天在CSDN上看到這一個提問帖子:《用SQL寫一個存儲過程10進制轉33進制代碼 》,原帖的問題是這樣:html

急求10進制轉33進制代碼。
 就是我想在SQL中建立一個存儲過程「T10TO33」能夠實現將10進制的數據轉換成33進制。
33進制規則是:1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,V,W,X,Y,Z,0
字母:I、O、U不用,其他正常流水,哪位大神幫忙寫一個,謝謝算法

 

2.分析

不一樣進制數據間的轉換,記得好久以前寫過相似的,參加《X進制與10進制之間的轉換》,基本的算法是相同的。ide

在這裏的要求,進制轉換中,26個字母中需排除I,O,U三個字母不用,那麼原來的X進制與10進制之間轉換方法中,就不能直接使用Char()函數。須要對用到的數字和字母從新做個排序,再定位轉換。函數

  2.1.初始化一個表變量@tb_tmp,內容以下:post

  

  

declare @tb_tmp as table(id int identity(0,1) primary key,radix char(1))
;with cte as (select top (36) row_number() over(order by getdate())-1 as id from sys.columns)
    insert into @tb_tmp(radix)
    select case when id>9 then char(55+id) else rtrim(id) end as radix from cte where char(55+id) not in ('I','O','U') 

 

  2.2 假設一個10進制的變量@input_int  int=50,循環對@input_int除33取模(@input_int%33),獲得的模,拿到2.1中的@tb_tmp匹配id,定位到對應的基數radix.即對應到33進制數據位。把獲得radix寫入變量@output ( @output =  找到的radix + @output)。每次循環,@input_int=@input_int/33,實現10進制拆分。當@input_int=0時,退出循環,返回@output,做爲10進制到33進制的結果值。測試

  

set @output=''
while(1=1)
begin   
    select @output=Convert(nvarchar(1024),Case (@input_int%33) when 0 then rtrim(@input_int%33) else (select radix from @tb_tmp where id=@input_int%33) end+@output),@input_int=@input_int/33
    if @input_int=0 break
end

 

3.完整代碼:

if object_id('T10TO33') Is not null
    Drop Proc T10TO33
Go
create procedure T10TO33(
@input_int int,
@output nvarchar(1024) output
)
as
set nocount on
declare @tb_tmp as table(id int identity(0,1) primary key,radix char(1))
;with cte as (select top (36) row_number() over(order by getdate())-1 as id from sys.columns)
    insert into @tb_tmp(radix)
    select case when id>9 then char(55+id) else rtrim(id) end as radix from cte where char(55+id) not in ('I','O','U') 
set @output=''
while(1=1)
begin   
    select @output=Convert(nvarchar(1024),Case (@input_int%33) when 0 then rtrim(@input_int%33) else (select radix from @tb_tmp where id=@input_int%33) end+@output),@input_int=@input_int/33
    if @input_int=0 break
end
go

 

4.測試:

declare @reuslt nvarchar(1024)

exec T10TO33 0,@reuslt output
print @reuslt --0

exec T10TO33 7,@reuslt output
print @reuslt --7
 
exec T10TO33 32,@reuslt output
print @reuslt --Z
 
exec T10TO33 33,@reuslt output
print @reuslt --10
 
exec T10TO33 34,@reuslt output
print @reuslt --11

exec T10TO33 50,@reuslt output
print @reuslt --1H
 
exec T10TO33 99,@reuslt output
print @reuslt --30
 
exec T10TO33 100,@reuslt output
print @reuslt --31

(完)url

相關文章
相關標籤/搜索