这是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;
/
出自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;
/
解决方案 »
- delphi 帮忙改写一个该函数成Unicode版本的,功能一样。
- 运行时,会提示违反了PRRIMARY KEY 不能在对象里添加错误 我如何返回到原来的界面??
- ~~!!用TQuery、TDataSource这2种组件如何连接数据库?
- FASTREPORT数据源的设置??
- 如何设置ehlib控件中的dbgrideh隐藏列功能?
- COM的线程模型的问题,困惑我许久了...
- 怎么取得TreeView中右键单击处的接点
- 关于数据库索引值的增加问题?
- 怎样屏蔽treeview里的纵向滚动条呀!
- Listbox控件的使用问题???
- 发布新软件——《我从来不怕背单词》——帮您打造自己的生词本!!进者有分!!
- 用线程实现对数据库表的操作,一运行就提示出错:未知的软件异常,Access violation,相互身份验证失败.该服务器在域控制器的密码过期
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;
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;