zhouxiaobin200 2011-02-17 15:41
浏览 944
已采纳

oracle金额转换问题

需求是这样的。

金额以分为单位 。 比如 : 1000 指的是 10元。
我要将1000 转换为 十元

应考虑更为复杂的情况。。 比如 三百八十元七角四分

请指教

  • 写回答

1条回答 默认 最新

  • jiangnan2112 2011-02-18 13:18
    关注

    下面这个可以,他是以元为单位,你改一下代码就行了。

    CREATE OR REPLACE FUNCTION convert_money
    (
    n_LowerMoney IN NUMBER,
    v_TransType IN NUMBER DEFAULT 1 -- 1: directly translate, 0: read it in words
    )RETURN VARCHAR2
    AS
    v_LowerStr VARCHAR2(200); -- 小写金额
    v_UpperPart VARCHAR2(200);
    v_UpperStr VARCHAR2(200); -- 大写金额
    BEGIN
    v_LowerStr := LTRIM(RTRIM(TO_CHAR(ROUND(n_LowerMoney,2),'9999999999999.99')));
    IF SUBSTR(v_LowerStr,1,1) = '#' THEN
    RETURN '转换金额超过计算范围(计算范围为:计算范围为: 0 - 9,999,999,999,999.99)';
    END IF;

    FOR I IN 1 .. LENGTH(v_LowerStr) LOOP
    SELECT DECODE(SUBSTR(v_LowerStr,LENGTH(v_LowerStr) - I + 1,1),
    '.','元',
    '0','零', '1','壹', '2','贰', '3','叁', '4','肆',
    '5','伍', '6','陆', '7','柒', '8','捌', '9','玖')||
    DECODE(I,1,'分',2,'角',3,NULL,4,NULL,5,'拾',6,'佰',7,'仟',8,'万',
    9,'拾',10,'佰',11,'仟',12,'亿',13,'拾',14,'佰',15,'仟',16,'万',NULL)
    INTO v_UpperPart FROM DUAL;

    v_UpperStr := v_UpperPart||v_UpperStr;
    END LOOP;

    IF v_TransType = 0 then
    v_UpperStr := REPLACE(v_UpperStr,'零拾','零');
    v_UpperStr := REPLACE(v_UpperStr,'零佰','零');
    v_UpperStr := REPLACE(v_UpperStr,'零仟','零');
    v_UpperStr := REPLACE(v_UpperStr,'零零零','零');
    v_UpperStr := REPLACE(v_UpperStr,'零零','零');
    v_UpperStr := REPLACE(v_UpperStr,'零角零分','整');
    v_UpperStr := REPLACE(v_UpperStr,'零分','整');
    v_UpperStr := REPLACE(v_UpperStr,'零角','零');
    v_UpperStr := REPLACE(v_UpperStr,'零亿零万零元','亿元');
    v_UpperStr := REPLACE(v_UpperStr,'亿零万零元','亿元');
    v_UpperStr := REPLACE(v_UpperStr,'零亿零万','亿');
    v_UpperStr := REPLACE(v_UpperStr,'零万零元','万元');
    v_UpperStr := REPLACE(v_UpperStr,'万零元','万元');
    v_UpperStr := REPLACE(v_UpperStr,'零亿','亿');
    v_UpperStr := REPLACE(v_UpperStr,'零万','万');
    v_UpperStr := REPLACE(v_UpperStr,'零元','元');
    v_UpperStr := REPLACE(v_UpperStr,'零零','零');
    END IF;

    -- 对壹元以下的金额的处理
    v_UpperStr := LTRIM(LTRIM(LTRIM(LTRIM(v_UpperStr,'元'),'零'),'角'),'分');
    IF SUBSTR(v_UpperStr,1,1) = '整' THEN
    v_UpperStr := '零元整';
    END IF;

    RETURN v_UpperStr;

    EXCEPTION WHEN OTHERS THEN
    RETURN '发生错误: '||SQLCODE||'--'||SQLERRM;
    END convert_money;

    测试结果如下:
    [img]
    http://dl.iteye.com/upload/attachment/420439/07d10211-7536-35bc-93db-b97a656e1f7d.jpg
    [/img]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况