首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求解方法解决方案

2012-01-16 
求解方法如何将dec(19,2)类型的数值转换成大写的RMB数值如0.05------------伍分0.00---------零圆10.00---

求解方法
如何将dec(19,2)类型的数值转换成大写的RMB数值

0.05                       ------------     伍分
0.00                       ---------           零圆
10.00                   ----------       拾圆
1000000000   -----------     拾亿
101.05               -------------   壹佰零壹圆零伍角

即将数值转换成正规的大写读法!
谢谢

[解决办法]
http://www.qiuhao.com/dispbbs.asp?BoardID=15&ID=3833
[解决办法]
收藏
[解决办法]
偶收藏了一个好像是邹老大写的
CREATE FUNCTION [dbo].[f_num_chn] (@num numeric(14,2))
RETURNS varchar(100) WITH ENCRYPTION
AS
BEGIN
--版权所有:pbsql
DECLARE @n_data VARCHAR(20),@c_data VARCHAR(100),@n_str VARCHAR(10),@i int

SET @n_data=RIGHT(SPACE(14)+CAST(CAST(ABS(@num*100) AS bigint) AS varchar(20)),14)
SET @c_data= ' '
SET @i=1
WHILE @i <=14
BEGIN
SET @n_str=SUBSTRING(@n_data,@i,1)
IF @n_str <> ' '
BEGIN
IF not ((SUBSTRING(@n_data,@i,2)= '00 ') or
((@n_str= '0 ') and ((@i=4) or (@i=8) or (@i=12) or (@i=14))))
SET @c_data=@c_data+SUBSTRING( '零壹贰叁肆伍陆柒捌玖 ',CAST(@n_str AS int)+1,1)
IF not ((@n_str= '0 ') and (@i <> 4) and (@i <> 8) and (@i <> 12))
SET @c_data=@c_data+SUBSTRING( '仟佰拾亿仟佰拾万仟佰拾圆角分 ',@i,1)
IF SUBSTRING(@c_data,LEN(@c_data)-1,2)= '亿万 '
SET @c_data=SUBSTRING(@c_data,1,LEN(@c_data)-1)
END
SET @i=@i+1
END
IF @num <0
SET @c_data= '(负数) '+@c_data
IF @num=0
SET @c_data= '零圆 '
IF @n_str= '0 '
SET @c_data=@c_data+ '整 '
RETURN(@c_data)
END
[解决办法]
不错!收藏!
[解决办法]
邹老大的函数经典。
[解决办法]
这的确是个相当麻烦的问题!
前一段时间一直都没有解决,惭愧啊~~~
[解决办法]
呵呵。。~
提一个小小的建议:
最后的 '整 ',应该是没有小数或者 小数点之后都是0的情况下才应该有
[解决办法]
楼主再参考这个:
--创建函数
Create Function ChangeBigSmall(@ChangeMoney money)
Returns VarChar(100) AS

Begin
Declare @String1 char(20)
Declare @String2 char(30)
Declare @String4 Varchar(100)
Declare @String3 Varchar(100)--从原A值中取出的值
Declare @i int --循环变量
Declare @J Int --A的值乘以100的字符串长度
Declare @Ch1 Varchar(100)--数字的汉语读法
Declare @Ch2 Varchar(100)--数字位的汉字读法
Declare @Zero Int--用来计算连续有几个零
Declare @ReturnValue VarChar(100)

Select @ReturnValue = ' '
Select @String1 = '零壹贰叁肆伍陆柒捌玖 '
Select @String2 = '万仟佰拾亿仟佰拾万仟佰拾元角分 '

Select @String4 = Cast(@ChangeMoney*100 as int)
Select @J=len(cast((@ChangeMoney*100) as int))
Select @String2=Right(@String2,@J)
Select @i = 1

While @i <= @j


Begin
Select @String3 = Substring(@String4,@i,1)

If @String3 <> '0 '
Begin
Select@Ch1 = Substring(@String1, Cast(@String3 as Int) + 1, 1)
Select@Ch2 = Substring(@String2, @i, 1)
Select@Zero = 0 --表示本位不为零
End
Else
Begin
If (@Zero = 0) Or (@i = @J - 9) Or (@i = @J - 5) Or (@i = @J - 1)
Select @Ch1 = '零 '
Else
Select @Ch1 = ' '
Select @Zero = @Zero + 1 --表示本位为0

--如果转换的数值需要扩大,那么需改动以下表达式 I 的值。
Select @Ch2 = ' '

If @i = @J - 10
Begin
Select @Ch2 = '亿 '
Select @Zero = 0
End

If @i = @J - 6
Begin
Select @Ch2 = '万 '
Select @Zero = 0
End

If @i = @J - 2
Begin
Select @Ch2 = '元 '
Select @Zero = 0
End

If @i = @J
Select @Ch2 = '整 '
End

Select @ReturnValue = @ReturnValue + @Ch1 + @Ch2
Select @i = @i+1
End

--最后将多余的零去掉
If CharIndex( '仟仟 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '仟仟 ', '仟 ')
If CharIndex( '佰佰 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '佰佰 ', '佰 ')
If CharIndex( '零元 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '零元 ', '元 ')
If CharIndex( '零万 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '零万 ', '万 ')
If CharIndex( '零亿 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '零亿 ', '亿 ')
If CharIndex( '零整 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '零整 ', '整 ')
If CharIndex( '零佰 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '零佰 ', '零 ')
If CharIndex( '零仟 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '零仟 ', '零 ')
If CharIndex( '元元 ',@ReturnValue) <> 0
Select @ReturnValue = Replace(@ReturnValue, '元元 ', '元 ')
Return @ReturnValue
End
go

--调用函数
select dbo.ChangeBigSmall(1000101.567)
go

--删除函数
drop function ChangeBigSmall

--查看结果
/*
壹佰万零壹佰零壹元伍角柒分
*/
[解决办法]
if @t= '圆 '
set @cdata=@cdata+@t
else
set @cdata=@cdata+ '零 '+@nstr+@t
-->
set @cdata=@cdata+ '零 '+@nstr+@t

热点排行