天堂向右,我依然向左

天下之大,虽离家千里,何处不可往!何事不可为!
生活之路,纵坎坷曲折,当奋斗不息,则精彩纷呈!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

进制的原理很简单,就是把传入的字符串进行拆解,然后进行转换,拆解后将乘以相对应位数的幂.(鄙视某些人不用进来看直接就点“反对”)
万能进制与十进制的转换SQLServer自定义函数版:

IF EXISTS (SELECT TOP 1 0 FROM Sysobjects WITH (NOLOCK) WHERE [name]='Fn_String2Int' AND xtype='fn')
    
DROP Function     Fn_String2Int
GO
/**********************************************************************************************************************
*        Function        : dbo.Fn_String2Int
*       Author            : KiloNet
*       Date            : 2009-07-23
*        Description        : 自定義進制轉十進制,目前代码最简洁的一种
*       Input Parameters: 
*        @h    varchar(20)    :要转换的字符
*        @fm    varchar(50)    :自定義進制格式

*        Sample            :
                            SELECT DBO.Fn_String2Int('0','0123456789ABCDEF')
*********************************************************************************************************************
*/
CREATE  Function dbo.Fn_String2Int( 
    
@h    varchar(20),--要转换的字符
    @fm varchar(50)    --自定义进制的字符
)
RETURNS BigInt
BEGIN
    
DECLARE @i BigInt,@r BigInt
    
SET @r=0
    
SET @i=1
    
WHILE @i<=LEN(@h)
    
BEGIN
        
SET @r=@r+(    CharIndex(Substring(@h,@i,1),@fm ,0 )-1    )*Power(LEN(@fm),LEN(@h)-@i)
        
SET @i=@i+1
    
END
    
RETURN @r
END
GO

/********************************************************/
/********************************************************/

IF EXISTS (SELECT TOP 1 0 FROM Sysobjects WITH (NOLOCK) WHERE [name]='Fn_Int2String' AND xtype='fn')
    
DROP Function     Fn_Int2String
GO
/**********************************************************************************************************************
*        Function        : dbo.Fn_Int2String
*       Author            : KiloNet
*       Date            : 2009-07-23
*        Description        :
進制自定義進制,目前代码最简洁的一种
*       Input Parameters: 
*        @h    BigInt        :要转换的十进制数值
*        @fm    varchar(50)    :自定義進制格式

*        Sample            :
                            SELECT DBO.Fn_Int2String(239,'0123456789ABCDEF')
*********************************************************************************************************************
*/
CREATE  Function dbo.Fn_Int2String( 
    
@h    BigInt,    --要转换的十进制数值
    @fm varchar(50)    --自定义进制的字符
)
RETURNS varchar(50)
BEGIN
    
DECLARE @r varchar(50),@_len int
    
SET @r=''
    
SET @_len = LEN(@fm)
    
WHILE @h/@_len>0
    
BEGIN
        
SET @r= Substring(@fm,@h % @_len+1,1+ @r
        
SET @h=@h/@_len
    
END
    
IF @h>0
        
SET @r=Substring(@fm,@h % @_len+1,1)+@r
    
IF LEN(@r)=0
        
SET @r = 0
    
RETURN @r
END
GO


自定义进制转十进制代码:

IF EXISTS(SELECT TOP 1 0 FROM SysObjects WITH (NOLOCK) WHERE [name]='String2Int' AND XType='P')
    
Drop PROC String2Int
GO
/**********************************************************************************************************************
*        Procudure        : dbo.String2Int
*       Author            : KiloNet
*       Date            : 2009-07-22
*        Description        : 自定義進制轉十進制
*       Input Parameters: 
*        @h    varchar(20)    :自定義進制格式的字符串
*        @fm    varchar(50)    :自定義進制格式
*        @r    bigint output:返回值

*        Sample            :
                            DECLARE @r BigInt
                            EXEC String2Int 'X','0123456789XYZ',@r output
                            SELECT @r
*********************************************************************************************************************
*/
CREATE PROC DBO.String2Int(
    
@h    varchar(20),--'Y'
    @fm varchar(50),--'0123456789XYZ'
    @r    bigint output 
)
AS
DECLARE @_sql nvarchar(4000),@_len int 

SET @_sql = '
declare @i bigint
set @r=0
set @i=1
while @i<=len(
'''+@h+''')
begin
    set @r=@r+
    (    
        CharIndex(substring(
'''+@h+''',@i,1),'''+@fm+''' ,0 )-1
    )
    *power(
'+ Convert(varchar(20),LEN(@fm)) +',len('''+@h+''')-@i)
    set @i=@i+1
end
'
print @_sql
EXEC  sp_executesql   @_sql,N'@r bigint  output',@r   output  
GO

/*
進制的原理很簡單,比如16進制轉10進制的算法:
十六進制:0123456789ABCDEF
0對應0
1對應1
..
A對應10
B對應11
..

此算法就是把傳入的字符串進行拆解,然后進行轉換,拆解后將乘以相對應位數的冪
A1分拆:

A                2
10*power(16,1)+ 2*power(16,0)

測試如下:

SELECT 10*power(16,1)+ 2*power(16,0)

DECLARE @r BigInt
EXEC String2Int 'A2','0123456789ABCDEF',@r output
SELECT @r

結果都是162
*/


十进制转自定义进制代码:

IF EXISTS(SELECT TOP 1 0 FROM SysObjects WITH (NOLOCK) WHERE [name]='Int2String' AND XType='P')
    
Drop PROC Int2String
GO
/**********************************************************************************************************************
*        Procudure        : dbo.Int2String
*       Author            : KiloNet
*       Date            : 2009-07-22
*        Description        : 十进制转自定义进制
*       Input Parameters: 
*        @h    BigInt        :十进制
*        @fm    varchar(50)    :自定义进制格式
*        @r    varchar(50) output:返回值
*        Sample            :
                            DECLARE @r varchar(50)
                            EXEC Int2String 25,'0123456789XYZ',@r output
                            SELECT @r
*********************************************************************************************************************
*/
CREATE PROC DBO.Int2String(
    
@h    BigInt    ,--12
    @fm varchar(50),--'0123456789XYZ'
    @r    varchar(50) output 
)
AS

DECLARE @_sql nvarchar(4000),@_len varchar(20
SET @_len = Convert(varchar(20),LEN(@fm))
SET @_sql = '
Declare @_i bigint
SET @_i = Convert(bigint,
'+ Convert(varchar(50),@h)+')

set @r=
''''

while @_i/
'+ @_len +'>0
begin

set @r= substring(
'''+@fm+''',@_i % '+ @_len +'+1,1) + @r

set @_i=@_i/
'+ @_len +'

end


if @_i>0
    set @r=substring(
'''+@fm+''',@_i % '+ @_len +'+1,1)+@r

'

EXEC  sp_executesql   @_sql,N'@r varchar(50)  output',@r   output  
GO


/*
进制的原理很简单,比如10进制转16进制的算法:
十六进制:0123456789ABCDEF
0对应0
1对应1
..
10对应A
11对应B
..

此算法就是把传入的數值按進制位數進行整除,取模得到的數即為16进制对应的字符,合并所有字符后即得结果

*/


posted on 2009-07-22 11:13  老舟  阅读(2187)  评论(5编辑  收藏  举报