这是ORACLE PL/SQL写的一个函数。
出自http://www.itpub.net/showthread.php?s=a74b536c2765540c0d5d934983464ed2&threadid=12262
改成PASCAL应该不很难!!!CREATE OR REPLACE FUNCTION CONVERT_MONEY(INPUT_NBR IN NUMBER DEFAULT 0)
/*
函数名称: CONVERT_MONEY
用 于: 将以分为单位输入的数值转换为大写汉字形式
注 释: 当转换后的汉字以分结尾时,不加“整”,当以角或元结尾时加“整”,这符合银行的规定。
数字金额凡是中间出现0的,必须转为大写的“零”,连续多个0时只转为一个“零”字,
结尾出现0时要加“整”,结尾不是0时不加“整”,这与前面的规定是一致的。
由于圆是货币单位,所以在多于1元钱时,圆是必须出现的。但是,万佰等是数字单位,有
时可能不出现。
代码:--------------------------------------------------------------------------------
*/
       RETURN VARCHAR2 IS
INPUT_NBR_BAK     NUMBER(20);      /*用于接收输入参数 INPUT_NBR */
NUM_CHARACTER     VARCHAR2(20) := '零壹贰叁肆伍陆柒捌玖';
UNIT_CHARACTER    VARCHAR2(40) := '分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿';
OUTPUT_STRING     VARCHAR2(100):= '';
REMAIN_NBR        NUMBER(20);
BIT_NUM           NUMBER(20);      /*每一位上的数字*/
BIT_UNIT          VARCHAR2(2);     /*每一位所对的单位*/
BIT_INDIC         NUMBER(1) :=0;   /*每一位的数字是否为0,0表示为0,1表示不为0*/
I                 NUMBER(2) :=0;   /*循环次数,索引变量从0开始*/
SPE_UNIT          VARCHAR2(2):='A';/*特殊位,包括万和亿,表示该亿汉字是否已写入结果字串*/
SIGN_INDIC        VARCHAR2(1);     /*用于标志数值符号:0为正,1为负*/
BEGIN
IF     INPUT_NBR=0 THEN RETURN '零圆整';
ELSIF  INPUT_NBR>0 THEN SIGN_INDIC:='0';
       INPUT_NBR_BAK:=INPUT_NBR;
ELSIF  INPUT_NBR<0 THEN SIGN_INDIC:='1';
       INPUT_NBR_BAK:=-INPUT_NBR;
END    IF;
LOOP
    REMAIN_NBR     := FLOOR(INPUT_NBR_BAK / 10);          /*取出除后的商*/
    BIT_NUM        := INPUT_NBR_BAK - REMAIN_NBR * 10;    /*取出当前位的数值*/
    INPUT_NBR_BAK  := REMAIN_NBR;                         /*保存商以做下一次循环*/
    BIT_UNIT       := RTRIM(SUBSTR(UNIT_CHARACTER, I * 2+ 1, 2));/*取出当前位的单位汉字*/
   
    IF    BIT_NUM > 0 THEN                                /*当前位的值不为0*/
          BIT_INDIC :=1;
          IF    I=6  OR I=14  THEN                        /*当前位是'万'位或'万亿'位*/
                SPE_UNIT:='万';                           /*表示万已经写入OUTPUT_STRING中,在BIT_UNIT中会包含万字*/
          ELSIF (I>=7 AND I<=9) OR (I>=15 AND I<=17) THEN /*当前位在万及千万之间或万亿及千万亿之间*/
                IF   SPE_UNIT!='万' THEN                  /*万还没写入OUTPUT_STRING中,则要写入一次*/
                     OUTPUT_STRING:='万'||OUTPUT_STRING;
                     SPE_UNIT:='万';                      /*表示万已经写入OUTPUT_STRING中*/
                END  IF;
          END   IF;                                       /*高于千万亿的数本程序不考虑了*/
          OUTPUT_STRING := SUBSTR(NUM_CHARACTER, BIT_NUM * 2 + 1, 2)||BIT_UNIT||OUTPUT_STRING;
    ELSE                                                  /*当前位等于0时,走此分支*/
          IF   BIT_INDIC = 1 THEN             /*当前位的前一位不为0时写 零 */
               OUTPUT_STRING := '零'||OUTPUT_STRING;
          END  IF;
          IF    BIT_UNIT IN ('圆','亿') THEN  /*若已达圆位,则圆是必须出现的,由于亿太大,不与万相同处理,所以就与圆一样处理*/
                SPE_UNIT:=BIT_UNIT;           /*保存圆与亿,以与万相区别*/
                OUTPUT_STRING := BIT_UNIT||OUTPUT_STRING;
          END   IF;
          BIT_INDIC  :=0;                     /*当前位的值为0*/
    END   IF;
    I := I + 1;
    EXIT WHEN INPUT_NBR_BAK = 0;
END LOOP;IF    MOD(INPUT_NBR,10)=0 THEN             /*输入的数字没有分,最小的是角,则尾部串个整*/
      OUTPUT_STRING:=OUTPUT_STRING||'整';
END   IF;
IF    SIGN_INDIC='1' THEN
      OUTPUT_STRING:='负'||OUTPUT_STRING;
END   IF;
RETURN OUTPUT_STRING;
END;
/

解决方案 »

  1.   

    谢谢大山,我Oracle不是很熟,看不太懂。还是请问各位网友有什么用Delphi语言写的函数实例吗?这样我能更好的理解他啊!不管怎样还是十分感谢啊!如能帮我解决这个问题,分数人人都有啊!
      

  2.   

    Function TForm1.upperCase(jf:String):string; //金额转换
    const
    chNum : array[0..9] of string = ('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
    chBit : array[0..5] of string = ('圆','拾','佰','仟','万','亿');
    var
    s:string;
    len, n , tmp: integer;
    bIsZero : Boolean;
    begin
    //对照表生成小写金额的大写
        bIsZero:=false;
        n:=Pos('.', jf); //小数点前的处理
        if n=0 then len:=Length(jf) else len:=n-1;
        if (len>5) and (len<9) then begin
           s:=uppercase(copy(jf,1,len-4));   //生成万位以后,亿位以前的大写
           delete(jf,1,len-4);
           s:=copy(s,1,length(s)-4)+'万';
           len:=4;
        end;
        for n:=1 to len do begin
            tmp:=StrToInt(jf[n]);
            if tmp=0 then
            begin
               if n<len then
                bIsZero:=true
               else if n=len then
                s:=s + chBit[len-n];
            end
            else
            begin
               if bIsZero then begin
                s:=s+chNum[0]+chNum[tmp] + chBit[len-n];
                bIsZero:=false;
               end
               else
                s:=s+chNum[tmp] + chBit[len-n];
            end;
        end;  //end for    if Length(jf)>len then begin //小数点后的处理
            if len+2<=Length(jf) then
            begin
                tmp:=StrToInt(jf[len+2]);
                if tmp=0 then
                s:=s+'零'
                else
                s:=s+chNum[tmp]+'角';
            end;
            if len+3<=Length(jf) then
            s:=s+chNum[StrToInt(jf[len+3])]+'分';
        end else s:=s+'整';
        result:=s;
    end;
      

  3.   

    根据上面的程序改的。呵呵Function uCase(jf:String):string; //金额转换
    const
    chNum : array[0..9] of string = ('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
    chBit : array[0..5] of string = ('圆','拾','佰','仟','万','亿');
    var
    s,s1:string;
    len, n , tmp: integer;
    bIsZero : Boolean;
    begin
    //对照表生成小写金额的大写
        bIsZero:=false;
        n:=Pos('.', jf); //小数点前的处理
        if n=0 then len:=Length(jf) else len:=n-1;
        s:='';
        if len>8 then begin
           s1:=ucase(copy(jf,1,len-8));   //生成亿位以后
           delete(jf,1,len-8);
           s:=copy(s1,1,length(s1)-4)+'亿';
           len:=8;
        end;    if (len>4) and (len<9) then begin
           s1:=ucase(copy(jf,1,len-4));   //生成万位以后,亿位以前的大写
           delete(jf,1,len-4);
           s:=s+copy(s1,1,length(s1)-4)+'万';
           len:=4;
        end;
        for n:=1 to len do begin
            tmp:=StrToInt(jf[n]);
            if tmp=0 then
            begin
               if n<len then
                bIsZero:=true
               else if n=len then
                s:=s + chBit[len-n];
            end
            else
            begin
               if bIsZero then begin
                s:=s+chNum[0]+chNum[tmp] + chBit[len-n];
                bIsZero:=false;
               end
               else
                s:=s+chNum[tmp] + chBit[len-n];
            end;
        end;  //end for    if Length(jf)>len then begin //小数点后的处理
            if len+2<=Length(jf) then
            begin
                tmp:=StrToInt(jf[len+2]);
                if tmp=0 then
                s:=s+'零'
                else
                s:=s+chNum[tmp]+'角';
            end;
            if len+3<=Length(jf) then
            s:=s+chNum[StrToInt(jf[len+3])]+'分';
        end else s:=s+'整';
        result:=s;
    end;