- 论坛徽章:
- 1
|
本帖最后由 A.com 于 2013-11-10 09:27 编辑
票据需要打印大写金额,网上找了好几个,逻辑一塌糊涂,测试结果也不怎么理想。干脆自己写了。
支持负数!t-sql测试过,mysql自己改吧
- /*
- 金额阿拉伯数字转换为中文的自定义函数
- */
- create function fatoc (@amount decimal(18, 2)) returns nvarchar(36) as
- begin
- declare @digital nvarchar(10) = '零壹贰叁肆伍陆柒捌玖'
- declare @position nvarchar(18) = '万仟佰拾亿仟佰拾万仟佰拾元角分'
- declare @posstr varchar(1) --从金额中取出一位的值
- declare @inputstr nvarchar(18)
- declare @i int --循环变量
- declare @l int --金额乘以100后的字符串长度
- declare @chdig nvarchar(1) --数字大写
- declare @chpos nvarchar(1) --数字位大写
- declare @zero int --连续零计数器
- declare @returnvalue nvarchar(36) = ''
- set @inputstr = replace(@amount, '.', '')
- set @l = len(@inputstr)
- set @position = right(@position, @l)
- if left(@inputstr, 1) = '-'
- set @position = '负' + right(@position, @l - 1)
- set @i = 1
- while @i <= @l
- begin
- set @posstr = substring(@inputstr, @i, 1) --取x位数字
- set @chdig = substring(@digital, cast(@posstr as int) + 1, 1) --x位数字转大写
- set @chpos = substring(@position, @i, 1) --x位对应位大写
- if @posstr != '0'
- begin
- --补回除亿、万、元位外的零
- if (@zero > 0) and (@i != @l - 9) and (@i != @l - 5) and (@i != @l - 1)
- set @returnvalue = @returnvalue + '零'
- set @zero = 0
- end
- if @posstr = '-'
- set @chdig = ''
- if @posstr = '0'
- begin
- set @chdig = '' --去大写零
- --去零对应位大写,保留亿、万、元位
- if (@i != @l - 10) and (@i != @l - 6) and (@i != @l - 2)
- set @chpos = ''
- --最后零取整
- if @i = @l
- set @chpos = '整'
- set @zero = @zero + 1
- end
- set @returnvalue = @returnvalue + @chdig + @chpos
- set @i = @i + 1
- end
- set @returnvalue = replace(@returnvalue, '亿万', '亿')
- return(@returnvalue)
- end
- go
复制代码 |
|