VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2082|回复: 16

求解方法

[复制链接]

1

主题

23

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-3-20 11:00:01 | 显示全部楼层 |阅读模式
如何将dec(19,2)类型的数值转换成大写的RMB数值

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

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

使用道具 举报

1

主题

23

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
 楼主| 发表于 2020-6-25 10:45:01 | 显示全部楼层
写了一天了,但在处理有0间断的数值时,没有找到好的处理办法!
回复

使用道具 举报

1

主题

23

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
 楼主| 发表于 2020-6-26 00:15:01 | 显示全部楼层
gahade(沙果) ( ) 信誉:100    Blog  2017-01-05 18:26:22  得分: 0  


   http://www.qiuhao.com/dispbbs.asp?BoardID=15&ID=3833
  
按照你给出的执行了一下
declare @ret varchar(200)

exec L2U 1001.00,1,@ret output

select @ret

--结果
壹仟零佰零拾壹元零角零分

其实我想要的是:壹仟零壹圆
回复

使用道具 举报

1

主题

23

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
 楼主| 发表于 2020-6-26 01:30:01 | 显示全部楼层
谢谢gahade(沙果) ( )
如果只要实现这种结果:壹仟零佰零拾壹元零角零分,那真的省事多了哦
回复

使用道具 举报

0

主题

93

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-6-26 17:30:01 | 显示全部楼层
偶收藏了一个:
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
回复

使用道具 举报

1

主题

23

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
 楼主| 发表于 2020-6-30 22:30:01 | 显示全部楼层
发现我的思路与他的很相似,比如使用'仟佰拾亿仟佰拾万仟佰拾圆角分'串,判断((@n_str='0') and (@i<>4) and (@i<>8) and (@i<>12)),不过我是判断1,5,9,13.
但我在处理多个连续零的时候处理不正确,而且pbsql写的比我简洁多了!值得收藏学习..

还有我写的方法有BUG的地方在pbsql也存在,就是当@n_str=0,4,8,12时,此时数值该位置的值为0时就会有点问题

如执行select dbo.f_num_chn(101000.00)
--结果
壹拾万壹仟圆整

实际上我觉得结果应该为:壹拾万零壹仟圆整
回复

使用道具 举报

1

主题

23

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
 楼主| 发表于 2020-7-9 15:00:01 | 显示全部楼层
那位高手来修复一下上面函数的小BUG
他写的太精简了,字字珠玑呀,精典哦
我能力不够,改不了
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-9 16:15:01 | 显示全部楼层
这的确是个相当麻烦的问题!
前一段时间一直都没有解决,惭愧啊~~~
回复

使用道具 举报

0

主题

126

帖子

73.00

积分

新手上路

Rank: 1

积分
73.00
发表于 2020-7-10 10:00:01 | 显示全部楼层
呵呵。。~
提一个小小的建议:
最后的'整',应该是没有小数或者 小数点之后都是0的情况下才应该有
回复

使用道具 举报

0

主题

30

帖子

25.00

积分

新手上路

Rank: 1

积分
25.00
发表于 2020-7-10 20:00:01 | 显示全部楼层
楼主再参考这个:
--创建函数
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

--查看结果
/*
壹佰万零壹佰零壹元伍角柒分
*/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表