|
--1、人民幣小寫金額轉(zhuǎn)大寫(第一版) ==================================================================== -- Title: 人民幣小寫金額轉(zhuǎn)大寫 -- Author: dobear Mail(MSN): dobear_0922@hotmail.com -- Environment: Vista + SQL2005 -- Date: 2008-06-12 -- Remark: dobear原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處,有問題請(qǐng)發(fā)Mail告之 -- ==================================================================== go --創(chuàng)建函數(shù) create function [dbo].[fn_getformatmoney] (@money numeric(14,2)) returns nvarchar(32) as begin declare @money_num nvarchar(20) --存儲(chǔ)金額的字符形式 , @money_chn nvarchar(32) --存儲(chǔ)金額的中文大寫形式 , @n_chn nvarchar(1), @i int --臨時(shí)變量
select @money_chn=case when @money>=0 then '' else '(負(fù))' end , @money=abs(@money) , @money_num=stuff(str(@money, 15, 2), 13, 1, '') --加前置空格補(bǔ)齊到位(去掉小數(shù)點(diǎn)) , @i=patindex('%[1-9]%', @money_num) --找到金額最高位
while @i>=1 and @i<=14 begin set @n_chn=substring(@money_num, @i, 1) if @n_chn<>'0' or (substring(@money_num,@i+1,1)<>'0' and @i not in(4, 8, 12, 14)) --轉(zhuǎn)換阿拉伯?dāng)?shù)字為中文大寫形式 set @money_chn=@money_chn+substring('零壹貳叁肆伍陸柒捌玖', @n_chn+1, 1) if @n_chn<>'0' or @i in(4, 8, 12) --添加中文單位 set @money_chn=@money_chn+substring('仟佰拾億仟佰拾萬仟佰拾圓角分',@i,1)
set @i=@i+1 end
set @money_chn=replace(@money_chn, '億萬', '億') --當(dāng)金額為x億零萬時(shí)去掉萬 if @money=0 set @money_chn='零圓整' --當(dāng)金額為零時(shí)返回'零圓整' if @n_chn='0' set @money_chn=@money_chn+'整' --當(dāng)金額末尾為零分時(shí)以'整'結(jié)尾
return @money_chn --返回大寫金額 end go --測(cè)試示例 select dbo.fn_getformatmoney(4545.44) --運(yùn)行結(jié)果 /* 肆仟伍佰肆拾伍圓肆角肆分 */
--2、人民幣小寫金額轉(zhuǎn)大寫(第二版) /*編寫者:(博客天地www.inbaidu.com ) 創(chuàng)建時(shí)間: 功能:小寫金額轉(zhuǎn)換成大寫 參數(shù):@LowerMoney 小寫金額加上小數(shù)點(diǎn)最長(zhǎng)可以保留位 輸出:大寫金額 簡(jiǎn)介:SQL版小寫金額轉(zhuǎn)換成大寫金額(最多可以精確到小數(shù)點(diǎn)四位) 注: Decimal 數(shù)據(jù)類型最多可存儲(chǔ)個(gè)數(shù)字 轉(zhuǎn)載:請(qǐng)保留以上信息,謝謝?。?! ********************************************************/ go --創(chuàng)建函數(shù) create function [dbo].[lowertoupper](@lowermoney decimal(38,4)) returns varchar(200) --返回的大寫金額的字符 as begin declare @lowerstr varchar(50) --小寫金額 declare @upperstr varchar(200) --大寫金額 declare @uppertmp varchar(15) --大寫金額的臨時(shí)字符串 declare @i int --遞增量 declare @lowerlen int --小寫金額的總長(zhǎng)度
set @lowerstr = @lowermoney --把decimal型的值全部賦給字符串變量注:(賦值過去的話如在字符串變量中是顯示.0000 因?yàn)樾?shù)位精確到四位,沒有的話,它會(huì)自動(dòng)補(bǔ)) set @lowerstr = replace(@lowerstr,'.','') --把小數(shù)點(diǎn)替換成空字符 --精確到小數(shù)點(diǎn)的四位角分厘毫
set @lowerlen = len(@lowerstr) --獲取小寫金額的總長(zhǎng)度(包括四個(gè)小數(shù)位) select @i = 1,@upperstr = '',@uppertmp = '' --設(shè)置默認(rèn)初始值
while @i <= @lowerlen begin set @uppertmp = case when substring(@lowerstr,@lowerlen - @i + 1,1) = '0' and @i = 5 and (convert(int,right(@lowerstr,4)) = 0 or@lowerlen > 5) then '元' --注:如果個(gè)位為的話,并且四位小數(shù)都是或者它的長(zhǎng)度超過(也就是超過元),則為元 --when substring(@lowerstr,@lowerlen - @i + 1,1) = '0' then '' else + case substring(@lowerstr,@lowerlen - @i + 1,1) --看當(dāng)前位是數(shù)字幾,就直接替換成漢字繁體大寫 when '0' then '零' when '1' then '壹' when '2' then '貳' when '3' then '叁' when '4' then '肆' when '5' then '伍' when '6' then '陸' when '7' then '柒' when '8' then '捌' when '9' then '玖' end + case @i when 1 then '毫' when 2 then '厘' when 3 then '分' when 4 then '角' when 5 then '元' when 9 then '萬' when 13 then '億' when 17 then '兆' when 21 then '京' when 25 then '垓' when 29 then '杼' when 33 then '穰' when 37 then '溝' --decimal型最大長(zhǎng)度是后面的就不用再考慮了 else + case @i%4 when 2 then '拾' --拾10 14 18 22 26 30 34 38 ………… when 3 then '佰' --佰11 15 19 23 27 31 35 39 ………… when 0 then '仟' --仟12 16 20 24 28 32 36 40 ………… end end end set @upperstr = isnull(@uppertmp,'') + isnull(@upperstr,'') set @i = @i + 1 end if convert(int,right(@lowerstr,4)) = 0 set @upperstr = left(@upperstr,len(@upperstr)-8) + '整' --判斷小數(shù)位數(shù)是不是都是,是就可以取整 while patindex('%零[仟佰拾角分厘毫零]%',@upperstr) <> 0 --把零拾或零佰或零零變成一個(gè)零 begin set @upperstr = stuff(@upperstr,patindex('%零[仟佰拾角分厘毫零]%',@upperstr),2,'零') end while patindex('%[溝穰杼垓京兆億萬]零[溝穰杼垓京兆億萬]%',@upperstr) <> 0 --把零萬或零億的清空掉 begin select @upperstr = stuff(@upperstr,patindex('%[溝穰杼垓京兆億萬]零[溝穰杼垓京兆億萬]%',@upperstr)+1,2,'') end while patindex('%[仟佰拾]零[溝穰杼垓京兆億萬]%',@upperstr) <> 0 --把類似拾零萬或佰零萬或仟零萬中間的零清空掉 begin select @upperstr = stuff(@upperstr,patindex('%[仟佰拾]零[溝穰杼垓京兆億萬]%',@upperstr)+1,1,'') end if patindex('%_零[元]%',@upperstr) <> 0 --把類似拾零元或百零元中間的零清空掉 begin select @upperstr = stuff(@upperstr,patindex('%_零[元]%',@upperstr) + 1,1,'') end else if (patindex('零[元]%',@upperstr) <> 0) and (convert(int,right(@lowerstr,4)) <> 0) --判斷當(dāng)前否是零元開頭,并且后面的四個(gè)小數(shù)不為 begin select @upperstr = stuff(@upperstr,patindex('零[元]%',@upperstr),2,'') --把零元清空掉 end if right(@upperstr,1) = '零' set @upperstr = left(@upperstr,len(@upperstr)-1) --如果最后一位是零也清空掉 if @upperstr = '元整' set @upperstr = '零' + @upperstr --如果只是的話,就顯示零元整 return @upperstr --返回大寫金額 end
--測(cè)試示例 Select dbo.LowerToUpper(120000000) --壹億貳仟萬元整 Select dbo.LowerToUpper(102000000) --壹億零貳佰萬元整 Select dbo.LowerToUpper(100200000) --壹億零貳拾萬元整 Select dbo.LowerToUpper(100020000) --壹億零貳萬元整 Select dbo.LowerToUpper(100002000) --壹億貳仟元整
--運(yùn)行結(jié)果 /* 壹億貳仟萬元整 壹億零貳佰萬元整 壹億零貳拾萬元整 壹億零貳萬元整 壹億貳仟元整 */
|
|
|