jine

  1. /* Formatted on 2009/12/22 17:03 (Formatter Plus v4.8.8) */ 
  2. CREATE OR REPLACE PACKAGE czutil 
  3. AS 
  4.    --将数字转化为汉字,支持千兆级数字的操作 
  5.    FUNCTION num2chi (numvalue IN NUMBER) 
  6.       RETURN VARCHAR2; 
  7.  
  8.    --将汉字转化为数字,支持千兆级数字的操作 
  9.    FUNCTION chi2num (chivalue IN VARCHAR2) 
  10.       RETURN NUMBER; 
  11. END
  12.  
  13. CREATE OR REPLACE PACKAGE BODY czutil 
  14. AS 
  15.    FUNCTION num2chi (numvalue IN NUMBER) 
  16.       RETURN VARCHAR2 
  17.    IS 
  18.       --汉字映射数字的映射表 
  19.       TYPE MAP IS TABLE OF VARCHAR2 (10) 
  20.          INDEX BY BINARY_INTEGER; 
  21.  
  22.       ling_jiu_map     MAP; 
  23.       shibaiqian_map   MAP; 
  24.       wanyizhao_map    MAP; 
  25.       --临时变量 
  26.       i                INT            := 0;                       --'临时变量 
  27.       j                INT            := 0;                        --临时变量 
  28.       k                INT            := 0;                        --临时变量 
  29.       x                INT            := 0;                        --临时变量 
  30.       y                INT            := 0;                        --临时变量 
  31.       str              VARCHAR2 (100) := '';                       --临时变量 
  32.       tmp              VARCHAR2 (100) := '';                       --临时变量 
  33.       integer_part     VARCHAR2 (100) := '';               --数字形式整数部分 
  34.       float_part       VARCHAR2 (100) := '';               --数字形式小数部分 
  35.       returnvalue      VARCHAR2 (100) := '';                         --返回值 
  36.    BEGIN 
  37.       --初始化数组 
  38.       ling_jiu_map (0) := '零'
  39.       ling_jiu_map (1) := '一'
  40.       ling_jiu_map (2) := '二'
  41.       ling_jiu_map (3) := '三'
  42.       ling_jiu_map (4) := '四'
  43.       ling_jiu_map (5) := '五'
  44.       ling_jiu_map (6) := '六'
  45.       ling_jiu_map (7) := '七'
  46.       ling_jiu_map (8) := '八'
  47.       ling_jiu_map (9) := '九'
  48.       shibaiqian_map (0) := ''
  49.       shibaiqian_map (1) := '十'
  50.       shibaiqian_map (2) := '百'
  51.       shibaiqian_map (3) := '千'
  52.       wanyizhao_map (0) := ''
  53.       wanyizhao_map (1) := '万'
  54.       wanyizhao_map (2) := '亿'
  55.       wanyizhao_map (3) := '兆'
  56.       --将数字拆分为整数与浮点数两个数字数组 
  57.       i := INSTR (numvalue, '.', 1); 
  58.  
  59.       IF i = 0 
  60.       THEN 
  61.          integer_part := SUBSTR (numvalue, 1); 
  62.       ELSE 
  63.          integer_part := FLOOR (numvalue); 
  64.          float_part := SUBSTR (numvalue, i + 1); 
  65.       END IF; 
  66.  
  67.       --计算整数部分 
  68.       i := LENGTH (integer_part); 
  69.       j := CEIL (i / 4); 
  70.       k := 0; 
  71.  
  72.       --将整数部分每四个分为一个组 
  73.       FOR k IN 0 .. j - 1 
  74.       LOOP 
  75.          IF k = 0 
  76.          THEN 
  77.             str := SUBSTR (integer_part, 1, i - 4 * j + 4); 
  78.          ELSE 
  79.             str := SUBSTR (integer_part, i - 4 * j + 4 * k + 1, 4); 
  80.          END IF; 
  81.  
  82.          x := LENGTH (str); 
  83.          y := 0; 
  84.          tmp := ''
  85.  
  86.          --将每个组中数据转化为汉字 
  87.          FOR y IN 0 .. x - 1 
  88.          LOOP 
  89.             tmp := 
  90.                   tmp 
  91.                || ling_jiu_map (SUBSTR (str, y + 1, 1)) 
  92.                || shibaiqian_map (x - y - 1); 
  93.          END LOOP; 
  94.  
  95.          --零处理 
  96.          tmp := RTRIM (tmp, '零');                  --去掉兆亿万前面个位上的零 
  97.          tmp := REGEXP_REPLACE (tmp, '(零[千百十])', '零');   --千百十位上的零 
  98.          tmp := REGEXP_REPLACE (tmp, '(零{2,})', '零'); --将千百十位上的零结合 
  99.          returnvalue := returnvalue || tmp || wanyizhao_map (j - k - 1); 
  100.       END LOOP; 
  101.  
  102.       --零处理 
  103.       --去掉兆亿万上的零 
  104.       returnvalue := REGEXP_REPLACE (returnvalue, '(零[兆亿万])', '零'); 
  105.       --将兆亿万位上的零结合 
  106.       returnvalue := REGEXP_REPLACE (returnvalue, '(零{2,})', '零'); 
  107.       --简称十位上的一 
  108.       returnvalue := REGEXP_REPLACE (returnvalue, '^一十', '十'); 
  109.       returnvalue := REGEXP_REPLACE (returnvalue, '零一十', '零十'); 
  110.  
  111.       --放进返回结果 
  112.       IF returnvalue IS NULL 
  113.       THEN 
  114.          returnvalue := '零'
  115.       END IF; 
  116.  
  117.       IF float_part IS NOT NULL 
  118.       THEN 
  119.          --计算小数部分 
  120.          k := 0; 
  121.          tmp := ''
  122.  
  123.          FOR k IN 1 .. LENGTH (float_part) 
  124.          LOOP 
  125.             tmp := tmp || ling_jiu_map (SUBSTR (float_part, k, 1)); 
  126.          END LOOP; 
  127.  
  128.          returnvalue := returnvalue || '点' || tmp; 
  129.       END IF; 
  130.  
  131.       RETURN returnvalue; 
  132.    END
  133.  
  134.    FUNCTION chi2num (chivalue IN VARCHAR2) 
  135.       RETURN NUMBER 
  136.    IS 
  137.       --汉字映射数字的映射表 
  138.       TYPE MAP IS TABLE OF BINARY_INTEGER 
  139.          INDEX BY VARCHAR2 (10); 
  140.  
  141.       ling_jiu_map     MAP; 
  142.       shibaiqian_map   MAP; 
  143.       wanyizhao_map    MAP; 
  144.       --临时变量 
  145.       i                INT            := 0;                       --'临时变量 
  146.       j                INT            := 0;                        --临时变量 
  147.       k                INT            := 0;                        --临时变量 
  148.       x                INT            := 0;                        --临时变量 
  149.       y                INT            := 0;                        --临时变量 
  150.       str              VARCHAR2 (100) := '';                       --临时变量 
  151.       tmp              INT            := 0;                        --临时变量 
  152.       tmp2             INT            := 0;                        --临时变量 
  153.       integer_part     VARCHAR2 (100) := '';               --数字形式整数部分 
  154.       float_part       VARCHAR2 (100) := '';               --数字形式小数部分 
  155.       returnvalue      NUMBER         := 0;                          --返回值 
  156.    BEGIN                                                          --初始化数组 
  157.       ling_jiu_map ('零') := 0; 
  158.       ling_jiu_map ('一') := 1; 
  159.       ling_jiu_map ('二') := 2; 
  160.       ling_jiu_map ('三') := 3; 
  161.       ling_jiu_map ('四') := 4; 
  162.       ling_jiu_map ('五') := 5; 
  163.       ling_jiu_map ('六') := 6; 
  164.       ling_jiu_map ('七') := 7; 
  165.       ling_jiu_map ('八') := 8; 
  166.       ling_jiu_map ('九') := 9; 
  167.       shibaiqian_map ('') := 0; 
  168.       shibaiqian_map ('十') := 1; 
  169.       shibaiqian_map ('百') := 2; 
  170.       shibaiqian_map ('千') := 3; 
  171.       wanyizhao_map ('') := 0; 
  172.       wanyizhao_map ('万') := 1; 
  173.       wanyizhao_map ('亿') := 2; 
  174.       wanyizhao_map ('兆') := 3; 
  175.       --将十位上的一补充完整 
  176.       str := REGEXP_REPLACE (chivalue, '^十', '一十'); 
  177.       str := REGEXP_REPLACE (str, '零十', '零一十'); 
  178.       --将数字拆分为整数与浮点数两个数字数组 
  179.       i := INSTR (str, '点', 1); 
  180.  
  181.       IF i = 0 
  182.       THEN 
  183.          integer_part := SUBSTR (str, 1); 
  184.       ELSE 
  185.          integer_part := SUBSTR (str, 1, i - 1); 
  186.          float_part := SUBSTR (str, i + 1); 
  187.       END IF; 
  188.  
  189.       --整型部分 
  190.       x := LENGTH (integer_part); 
  191.       str := ''
  192.       tmp := 0; 
  193.       tmp2 := 0; 
  194.  
  195.       FOR k IN 1 .. x 
  196.       LOOP 
  197.          str := SUBSTR (integer_part, k, 1); 
  198.  
  199.          IF str IN ('万', '亿', '兆'
  200.          THEN 
  201.             --当碰到万亿兆时 
  202.             tmp := tmp + tmp2; 
  203.             returnvalue := 
  204.                        returnvalue + tmp * POWER (10000, wanyizhao_map (str)); 
  205.             tmp := 0; 
  206.             tmp2 := 0; 
  207.          ELSIF str IN ('十', '百', '千'
  208.          THEN 
  209.             --当碰到十百千时 
  210.             tmp := tmp + tmp2 * POWER (10, shibaiqian_map (str)); 
  211.             tmp2 := 0; 
  212.          ELSE 
  213.             --当碰到数字时 
  214.             tmp2 := ling_jiu_map (str); 
  215.          END IF; 
  216.       END LOOP; 
  217.  
  218.       --最后将没有小于万位数加到整数中去 
  219.       tmp := tmp + tmp2; 
  220.       returnvalue := returnvalue + tmp; 
  221.  
  222.       IF float_part IS NOT NULL 
  223.       THEN 
  224.          --计算小数部分 
  225.          k := 0; 
  226.          tmp := ''
  227.  
  228.          FOR k IN 1 .. LENGTH (float_part) 
  229.          LOOP 
  230.             tmp := tmp || ling_jiu_map (SUBSTR (float_part, k, 1)); 
  231.          END LOOP; 
  232.  
  233.          returnvalue := returnvalue || '.' || tmp; 
  234.       END IF; 
  235.  
  236.       RETURN returnvalue; 
  237.    END
  238. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值