进制的原理很简单,就是把传入的字符串进行拆解,然后进行转换,拆解后将乘以相对应位数的幂.(鄙视某些人不用进来看直接就点“反对”)
万能进制与十进制的转换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
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
*/
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进制对应的字符,合并所有字符后即得结果
*/
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进制对应的字符,合并所有字符后即得结果
*/
id 博主 = [[KILONET.CNBLOGS.COM alloc] initWithValue:@"天堂向右,我依然向左"
网名:@"老舟"
兴趣:@"影音,阅读"
动态:@"系统架构设计,Android通信模块开发"
网址:@"http://kilonet.cnblogs.com"
签名:@"--------------------------------------------------
Stay Hungry , Stay Foolish
求 知 若 渴,处 事 若 愚
--------------------------------------------------"
]; // Never Release