- /* Formatted on 2009/12/22 17:03 (Formatter Plus v4.8.8) */
- CREATE OR REPLACE PACKAGE czutil
- AS
- --将数字转化为汉字,支持千兆级数字的操作
- FUNCTION num2chi (numvalue IN NUMBER)
- RETURN VARCHAR2;
- --将汉字转化为数字,支持千兆级数字的操作
- FUNCTION chi2num (chivalue IN VARCHAR2)
- RETURN NUMBER;
- END;
- CREATE OR REPLACE PACKAGE BODY czutil
- AS
- FUNCTION num2chi (numvalue IN NUMBER)
- RETURN VARCHAR2
- IS
- --汉字映射数字的映射表
- TYPE MAP IS TABLE OF VARCHAR2 (10)
- INDEX BY BINARY_INTEGER;
- ling_jiu_map MAP;
- shibaiqian_map MAP;
- wanyizhao_map MAP;
- --临时变量
- i INT := 0; --'临时变量
- j INT := 0; --临时变量
- k INT := 0; --临时变量
- x INT := 0; --临时变量
- y INT := 0; --临时变量
- str VARCHAR2 (100) := ''; --临时变量
- tmp VARCHAR2 (100) := ''; --临时变量
- integer_part VARCHAR2 (100) := ''; --数字形式整数部分
- float_part VARCHAR2 (100) := ''; --数字形式小数部分
- returnvalue VARCHAR2 (100) := ''; --返回值
- BEGIN
- --初始化数组
- ling_jiu_map (0) := '零';
- ling_jiu_map (1) := '一';
- ling_jiu_map (2) := '二';
- ling_jiu_map (3) := '三';
- ling_jiu_map (4) := '四';
- ling_jiu_map (5) := '五';
- ling_jiu_map (6) := '六';
- ling_jiu_map (7) := '七';
- ling_jiu_map (8) := '八';
- ling_jiu_map (9) := '九';
- shibaiqian_map (0) := '';
- shibaiqian_map (1) := '十';
- shibaiqian_map (2) := '百';
- shibaiqian_map (3) := '千';
- wanyizhao_map (0) := '';
- wanyizhao_map (1) := '万';
- wanyizhao_map (2) := '亿';
- wanyizhao_map (3) := '兆';
- --将数字拆分为整数与浮点数两个数字数组
- i := INSTR (numvalue, '.', 1);
- IF i = 0
- THEN
- integer_part := SUBSTR (numvalue, 1);
- ELSE
- integer_part := FLOOR (numvalue);
- float_part := SUBSTR (numvalue, i + 1);
- END IF;
- --计算整数部分
- i := LENGTH (integer_part);
- j := CEIL (i / 4);
- k := 0;
- --将整数部分每四个分为一个组
- FOR k IN 0 .. j - 1
- LOOP
- IF k = 0
- THEN
- str := SUBSTR (integer_part, 1, i - 4 * j + 4);
- ELSE
- str := SUBSTR (integer_part, i - 4 * j + 4 * k + 1, 4);
- END IF;
- x := LENGTH (str);
- y := 0;
- tmp := '';
- --将每个组中数据转化为汉字
- FOR y IN 0 .. x - 1
- LOOP
- tmp :=
- tmp
- || ling_jiu_map (SUBSTR (str, y + 1, 1))
- || shibaiqian_map (x - y - 1);
- END LOOP;
- --零处理
- tmp := RTRIM (tmp, '零'); --去掉兆亿万前面个位上的零
- tmp := REGEXP_REPLACE (tmp, '(零[千百十])', '零'); --千百十位上的零
- tmp := REGEXP_REPLACE (tmp, '(零{2,})', '零'); --将千百十位上的零结合
- returnvalue := returnvalue || tmp || wanyizhao_map (j - k - 1);
- END LOOP;
- --零处理
- --去掉兆亿万上的零
- returnvalue := REGEXP_REPLACE (returnvalue, '(零[兆亿万])', '零');
- --将兆亿万位上的零结合
- returnvalue := REGEXP_REPLACE (returnvalue, '(零{2,})', '零');
- --简称十位上的一
- returnvalue := REGEXP_REPLACE (returnvalue, '^一十', '十');
- returnvalue := REGEXP_REPLACE (returnvalue, '零一十', '零十');
- --放进返回结果
- IF returnvalue IS NULL
- THEN
- returnvalue := '零';
- END IF;
- IF float_part IS NOT NULL
- THEN
- --计算小数部分
- k := 0;
- tmp := '';
- FOR k IN 1 .. LENGTH (float_part)
- LOOP
- tmp := tmp || ling_jiu_map (SUBSTR (float_part, k, 1));
- END LOOP;
- returnvalue := returnvalue || '点' || tmp;
- END IF;
- RETURN returnvalue;
- END;
- FUNCTION chi2num (chivalue IN VARCHAR2)
- RETURN NUMBER
- IS
- --汉字映射数字的映射表
- TYPE MAP IS TABLE OF BINARY_INTEGER
- INDEX BY VARCHAR2 (10);
- ling_jiu_map MAP;
- shibaiqian_map MAP;
- wanyizhao_map MAP;
- --临时变量
- i INT := 0; --'临时变量
- j INT := 0; --临时变量
- k INT := 0; --临时变量
- x INT := 0; --临时变量
- y INT := 0; --临时变量
- str VARCHAR2 (100) := ''; --临时变量
- tmp INT := 0; --临时变量
- tmp2 INT := 0; --临时变量
- integer_part VARCHAR2 (100) := ''; --数字形式整数部分
- float_part VARCHAR2 (100) := ''; --数字形式小数部分
- returnvalue NUMBER := 0; --返回值
- BEGIN --初始化数组
- ling_jiu_map ('零') := 0;
- ling_jiu_map ('一') := 1;
- ling_jiu_map ('二') := 2;
- ling_jiu_map ('三') := 3;
- ling_jiu_map ('四') := 4;
- ling_jiu_map ('五') := 5;
- ling_jiu_map ('六') := 6;
- ling_jiu_map ('七') := 7;
- ling_jiu_map ('八') := 8;
- ling_jiu_map ('九') := 9;
- shibaiqian_map ('') := 0;
- shibaiqian_map ('十') := 1;
- shibaiqian_map ('百') := 2;
- shibaiqian_map ('千') := 3;
- wanyizhao_map ('') := 0;
- wanyizhao_map ('万') := 1;
- wanyizhao_map ('亿') := 2;
- wanyizhao_map ('兆') := 3;
- --将十位上的一补充完整
- str := REGEXP_REPLACE (chivalue, '^十', '一十');
- str := REGEXP_REPLACE (str, '零十', '零一十');
- --将数字拆分为整数与浮点数两个数字数组
- i := INSTR (str, '点', 1);
- IF i = 0
- THEN
- integer_part := SUBSTR (str, 1);
- ELSE
- integer_part := SUBSTR (str, 1, i - 1);
- float_part := SUBSTR (str, i + 1);
- END IF;
- --整型部分
- x := LENGTH (integer_part);
- str := '';
- tmp := 0;
- tmp2 := 0;
- FOR k IN 1 .. x
- LOOP
- str := SUBSTR (integer_part, k, 1);
- IF str IN ('万', '亿', '兆')
- THEN
- --当碰到万亿兆时
- tmp := tmp + tmp2;
- returnvalue :=
- returnvalue + tmp * POWER (10000, wanyizhao_map (str));
- tmp := 0;
- tmp2 := 0;
- ELSIF str IN ('十', '百', '千')
- THEN
- --当碰到十百千时
- tmp := tmp + tmp2 * POWER (10, shibaiqian_map (str));
- tmp2 := 0;
- ELSE
- --当碰到数字时
- tmp2 := ling_jiu_map (str);
- END IF;
- END LOOP;
- --最后将没有小于万位数加到整数中去
- tmp := tmp + tmp2;
- returnvalue := returnvalue + tmp;
- IF float_part IS NOT NULL
- THEN
- --计算小数部分
- k := 0;
- tmp := '';
- FOR k IN 1 .. LENGTH (float_part)
- LOOP
- tmp := tmp || ling_jiu_map (SUBSTR (float_part, k, 1));
- END LOOP;
- returnvalue := returnvalue || '.' || tmp;
- END IF;
- RETURN returnvalue;
- END;
- END czutil;
Create Procedure AtoC
@ChangeMoney Money
as
Set Nocount ON
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, '元元', '元')
Select @ReturnValue
GO