您的位置:首页 > 其它

将阿拉伯数字转换成英文的存储过程(转载)

2009-03-27 12:19 387 查看
Code

create function decodehundred(@hundredstring varchar(300) )

returns varchar(1000)

as

begin

declare @tmp varchar(1000),@decodehundred varchar(1000)

set @decodehundred = ''

declare @strno1 varchar(1000)

select @strno1 = 'One Two Three Four Five ' +

'Six Seven Eight Nine Ten ' +

'Eleven Twelve Thirteen Fourteen Fifteen '+

'Sixteen Seventeen Eighteen Nineteen '

declare @strtens1 varchar(1000)

set @strtens1 = 'Ten Twenty Thirty Forty Fifty ' +

'Sixty Seventy Eighty Ninety '

declare @unit4 varchar(10)

set @unit4 = 'Hundred'

if len(@hundredstring) > 0 and len(@hundredstring) <= 3

begin

if len(@hundredstring) = 1

begin

set @tmp = cast(@hundredstring as int)

if @tmp <> 0

set @decodehundred =

rtrim(substring(@strno1 ,(@tmp - 1) * 10 + 1,10))

end

if len(@hundredstring) = 2

begin

set @tmp = cast(@hundredstring as int)

if @tmp <> 0

if @tmp < 20

if @tmp < 10

set @decodehundred = 'Zero '+rtrim(substring(@strno1 ,(@tmp - 1) * 10 + 1,10))

else

set @decodehundred =

rtrim(substring(@strno1 ,(@tmp - 1) * 10 + 1,10))

else

if cast(right(@hundredstring, 1) as int ) = 0

set @decodehundred = rtrim(substring(@strtens1 ,(@tmp/10 - 1) * 10 + 1,10))

else

set @decodehundred = rtrim(substring(@strtens1 ,(@tmp/10 - 1) * 10 + 1,10))

+ '-' + rtrim(substring(@strno1 ,(cast(right(@hundredstring, 1) as int) -1) * 10 + 1,10))

end

if len(@hundredstring) = 3

begin

if cast(left(@hundredstring, 1) as int) <> 0

set @decodehundred = rtrim(substring(@strno1 ,(cast(left(@hundredstring, 1) as int)- 1) * 10 + 1,10))

+ ' ' + @unit4 + ' ' + dbo.decodehundred(right(@hundredstring, 2))

else

set @decodehundred = dbo.decodehundred(right(@hundredstring, 2))

end

end

return @decodehundred

end

go

create function f_numbertostring(@number as numeric(12,2))

returns varchar(1000)

as

begin

declare @str varchar(100), @beforepoint varchar(100), @afterpoint varchar(100), @tmpstr varchar(100),@numbertostring varchar(200)

declare @point int,@nnumlen int

declare @nbit integer

declare @curstring varchar(100)

set @numbertostring = ''

declare @unit1 varchar(1000)

set @unit1 = 'Thousand Million Billion Hundred Only Point * And '

set @str = cast(round(@number, 2) as varchar)

if charindex('.', @str) = 0

begin

set @beforepoint = @str

set @afterpoint = ''

end

else

begin

begin

set @beforepoint = left(@str, charindex('.', @str) - 1)

set @afterpoint = right(@str, len(@str) - charindex('.', @str))

end

if len(@beforepoint) > 12

begin

set @numbertostring = 'Too big.'

return @numbertostring

end

set @str = ''

while len(@beforepoint) > 0

begin

set @nnumlen = len(@beforepoint)

if @nnumlen % 3 = 0

begin

set @curstring = left(@beforepoint, 3)

set @beforepoint = right(@beforepoint, @nnumlen - 3)

end

else

begin

set @curstring = left(@beforepoint, (@nnumlen % 3))

set @beforepoint = right(@beforepoint, @nnumlen - (@nnumlen % 3))

end

set @nbit = len(@beforepoint) / 3

set @tmpstr = dbo.decodehundred(@curstring)

if (@beforepoint = REPLICATE ('0',len(@beforepoint)) or @nbit = 0) and len(@curstring) = 3

if cast(left(@curstring, 1) as int) <> 0 and cast(right(@curstring, 2) as int) <> 0

set @tmpstr = left(@tmpstr,charindex('Hundred', @tmpstr) + len('Hundred')) + 'And ' +

right(@tmpstr, len(@tmpstr) - (charindex('Hundred',@tmpstr ) + 7))

else if cast(left(@curstring, 1) as int) <> 0 and cast(right(@curstring, 2) as int) = 0

set @tmpstr = 'And ' + @tmpstr

if @nbit = 0

set @str = ltrim(@str + ' ' + @tmpstr)

else

set @str = ltrim(@str + ' ' + @tmpstr + ' ' +

rtrim(substring(@unit1 ,(@nbit - 1) * 10 + 1,10)))

if left(@str, 3) = 'And'

set @str = ltrim(right(@str, len(@str) - 3))

if @beforepoint = REPLICATE('0',len(@beforepoint))

break

end

set @beforepoint = replace( @str,'*',' ')

if len(@afterpoint) > 0

set @afterpoint = 'Point' + ' ' + dbo.decodehundred(@afterpoint) + ' '-- + @unit7

else

set @afterpoint = 'Only'

set @numbertostring = replace(@beforepoint,'Zero','') + ' ' + @afterpoint

end

set @numbertostring = ltrim(rtrim(@numbertostring))

if right(@numbertostring,5) = 'point'

set @numbertostring = replace(@numbertostring,'point','')

return @numbertostring

end

go

select dbo.f_numbertostring(12223.01)

/*

------------------------------------

one hundred and twenty-three

(所影响的行数为 1 行)

*/

select dbo.f_numbertostring(100001000)

/*

------------------------------------

twelve thousand three hundred and one

(所影响的行数为 1 行)

*/

drop function decodehundred,f_numbertostring
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: