輸入數字型金額的字符串,輸出為大寫
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