目的地-Destination 前程似锦、未来可期、寻得良人、共赴白头,祝你也祝我。
博主 目的地-Destination
沪ICP备16003146号-2沪公网安备 31010702004922号萌ICP备20238488号博主 昨天 10:29 在线自豪地使用 Typecho 建站搭配使用 🌻Sunny 主题当前在线 9 人
歌曲封面 未知作品

沪ICP备16003146号-2

沪公网安备 31010702004922号

萌ICP备20238488号

网站已运行 7 年 349 天 8 小时 0 分

Powered by Typecho & Sunny

9 online · 56 ms

Title

MySQL自定义函数实现金额转大写

Chrison

·

烂笔头

·

Article
⚠️ 本文最后更新于2022年12月10日,已经过了690天没有更新,若内容或图片失效,请留言反馈

MySQL中自定义函数,然后在SQL语句中调用即可

♾️ text 代码:
CREATE  FUNCTION fun_convertm(MONEY VARCHAR(150) ) RETURNS VARCHAR(150) CHARSET utf8
    DETERMINISTIC
BEGIN
DECLARE  RESULT      VARCHAR(100); -- 返回字符串
DECLARE  NUM_ROUND   VARCHAR(100); -- 转换数字为小数点后2位的字符(正数)
DECLARE  NUM_LEFT    VARCHAR(100); -- 小数点左边的数字
DECLARE  NUM_RIGHT   VARCHAR(2); -- 小数点右边的数字
DECLARE  STR1        VARCHAR(10); -- 数字大写
DECLARE  STR2        VARCHAR(16); -- 数字位数(从低至高)
DECLARE  NUM_PRE     INT; -- 前一位上的数字
DECLARE  NUM_CURRENT INT; -- 当前位上的数字
DECLARE  NUM_COUNT   INT; -- 当前数字位数
DECLARE  NUM1        INT;
SET    MONEY=CONVERT(MONEY,DECIMAL(14,2));
SET NUM_ROUND=CONCAT(MONEY, '');
SET STR1='零壹贰叁肆伍陆柒捌玖'; 
SET STR2='圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟';
SET NUM_PRE=1;
SET NUM_COUNT=0;
SET NUM_LEFT=FLOOR(MONEY);
SET NUM_RIGHT=REPLACE(NUM_ROUND,CONCAT(NUM_LEFT,'.'),'');
 
IF MONEY IS NULL THEN
SET RESULT=NULL;
END IF; -- 转换数字为null时返回null
 
IF LENGTH(NUM_LEFT)>=8 THEN SET NUM1=CAST(SUBSTR(NUM_LEFT, -8, 4) AS SIGNED);
ELSEIF LENGTH(NUM_LEFT)>4 THEN    SET NUM1=CAST(SUBSTR(NUM_LEFT, -LENGTH(NUM_LEFT), LENGTH(NUM_LEFT)-4) AS SIGNED);
ELSE SET NUM1=CAST(SUBSTR(NUM_LEFT, 1, 4) AS SIGNED);
END IF;
 
IF LENGTH(NUM_LEFT) > 16 THEN SET RESULT='**********';
END IF; -- 数字整数部分超过16位时
 
 -- 采用从低至高的算法,先处理小数点右边的数字
IF LENGTH(NUM_RIGHT) = 2 THEN
   IF CAST(SUBSTR(NUM_RIGHT, 1, 1) AS SIGNED) = 0 THEN
      SET RESULT = CONCAT('零' ,
                SUBSTR(STR1, CAST(SUBSTR(NUM_RIGHT, 2, 1) AS SIGNED) + 1, 1) , '分');
   ELSE
      SET RESULT = CONCAT(SUBSTR(STR1, CAST(SUBSTR(NUM_RIGHT, 1, 1) AS SIGNED) + 1, 1) , '角' ,
                SUBSTR(STR1, CAST(SUBSTR(NUM_RIGHT, 2, 1) AS SIGNED) + 1, 1) , '分');
   END IF;
ELSE 
   IF LENGTH(NUM_RIGHT) = 1 THEN
    SET RESULT = CONCAT(SUBSTR(STR1, CAST(SUBSTR(NUM_RIGHT, 1, 1) AS SIGNED) + 1, 1) , '角整');
   ELSE
        SET RESULT = '整';
   END IF;
END IF;
 
-- 再处理小数点左边的数字
myloop:LOOP
SET NUM_COUNT=NUM_COUNT+1; -- 当前数字位数
SET NUM_CURRENT=CAST(SUBSTR(NUM_LEFT, LENGTH(NUM_LEFT)-NUM_COUNT+1, 1) AS SIGNED);
IF  NUM_CURRENT > 0 THEN SET RESULT=CONCAT(SUBSTR(STR1, NUM_CURRENT + 1, 1) ,
                SUBSTR(STR2, NUM_COUNT, 1) , RESULT);
ELSE
    IF NUM_COUNT = 5 THEN
       IF MOD(NUM_COUNT - 1, 4) = 0 AND NUM1 <> 0 THEN SET RESULT = CONCAT(SUBSTR(STR2, NUM_COUNT, 1) , RESULT); SET NUM_PRE = 0;
       END IF;
    ELSE
       IF MOD(NUM_COUNT - 1, 4) = 0 THEN SET RESULT  = CONCAT(SUBSTR(STR2, NUM_COUNT, 1) , RESULT); SET  NUM_PRE = 0; -- 元、万,亿前不准加零
       END IF;
    END IF;
    IF NUM_PRE > 0 OR LENGTH(NUM_LEFT) = 1 THEN
        -- 上一位数字不为0或只有个位时
        SET RESULT = CONCAT(SUBSTR(STR1, NUM_CURRENT + 1, 1) , RESULT);
    END IF;
END IF;
SET NUM_PRE = NUM_CURRENT;
IF NUM_COUNT>=LENGTH(NUM_LEFT) THEN LEAVE myloop;
END IF;
END LOOP myloop; 
IF MONEY < 0 THEN
    -- 转换数字是负数时
    SET RESULT =CONCAT( '负' , RESULT);
END IF;
 SET RESULT=REPLACE(RESULT,'零零分','整');
 SET RESULT=REPLACE(RESULT,'零分','整');
 SET RESULT=REPLACE(RESULT,'元整','圆整');
RETURN RESULT;
END
现在已有 226 次阅读,2 条评论,0 人点赞
Comment:共2条
发表
  1. 头像
    @

    好友

    荒野孤灯
    大兄弟,牛 啊
    · Chrome · 中国湖北省武汉市电信

    👍

    💖

    💯

    💦

    😄

    🪙

    👍 0 💖 0 💯 0 💦 0 😄 0 🪙 0
    1. 头像
      @
      哪里牛啊
      我只会java后端,前端不行。靠你的主题了
      · 火狐浏览器 · 中国江苏省苏州市电信

      👍

      💖

      💯

      💦

      😄

      🪙

      👍 0 💖 0 💯 0 💦 0 😄 0 🪙 0
搜 索 消 息 足 迹
你还不曾留言过..
你还不曾留下足迹..
博主 不再显示
博主