# 數字轉中文金額 ###### tags: `SQL` `ORACLE` `MSSQL` # mssql ```sql= USE [LCMS] GO /****** Object: UserDefinedFunction [dbo].[f_chinese_amt] Script Date: 2020/6/3 上午 10:19:21 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[f_chinese_amt] (@num INT) returns VARCHAR(100) AS BEGIN DECLARE @temp INT, @res INT, @i TINYINT DECLARE @str VARCHAR(100), @no VARCHAR(20), @unit VARCHAR(16) SELECT @str = '', @no = '零壹貳參肆伍陸柒捌玖', @unit = '拾佰仟萬拾佰仟億' SET @temp=@num SELECT @i = 0, @res = @temp%10, @temp = @temp / 10 WHILE @temp > 0 BEGIN IF @i = 0 SET @str=Substring(@no, @res + 1, 1) ELSE SET @str=Substring(@no, @res+1, 1) + Substring(@unit, @i, 1) + @str SELECT @res = @temp%10, @temp = @temp / 10 SET @i=@i + 1 END SET @str=Substring(@no, @res+1, 1) + Substring(@unit, @i, 1) + @str SET @str=Replace(@str, '零拾', '零') SET @str=Replace(@str, '零佰', '零') SET @str=Replace(@str, '零仟', '零') SET @str=Replace(@str, '零拾', '零') SET @str=Replace(@str, '零萬', '萬') WHILE @i > 0 BEGIN SET @str=Replace(@str, '零', '零') SET @i=Charindex('零零', @str) END SET @str=Replace(@str, '零萬', '萬') SET @str=Replace(@str, '億萬', '億') IF RIGHT(@str, 1) = '零' SET @str=LEFT(@str, Len(@str) - 1) SET @str=@str + '元整' RETURN @str END ``` # oralce ```sql= FUNCTION f_chinese_amt(form_amt NUMBER) RETURN VARCHAR2 IS w_amt VARCHAR2(12) := 0; w_length NUMBER(12) := 0; w_temp VARCHAR2(50) := NULL; w_format VARCHAR2(100) := NULL; w_count NUMBER(12) := 0; w_minus_flag VARCHAR2(1); w_form_amt NUMBER; BEGIN IF form_amt < 0 THEN w_form_amt := form_amt * -1; w_minus_flag := 'Y'; ELSE w_form_amt := form_amt; w_minus_flag := 'N'; END IF; w_count := LENGTH(w_form_amt); w_length := 12; w_amt := LPAD(TO_CHAR(w_form_amt),12,'0'); --個位數-------------------------------------------------------| IF SUBSTR(w_amt,w_length-3,1) = 0 THEN IF SUBSTR(w_amt,w_length-2,1) = 0 THEN IF SUBSTR(w_amt,w_length-1,1) = 0 THEN IF SUBSTR(w_amt,w_length,1) = 0 THEN w_format := w_format; --w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); --w_format := w_temp||w_format; ELSE IF w_count > 4 THEN w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-3,1) ); w_format := w_temp||w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; END IF; END IF; ELSE IF SUBSTR(w_amt,w_length,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-1,1) ); w_format := w_temp||'拾'||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-1,1) = 0 THEN IF SUBSTR(w_amt,w_length,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-1,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-1,1) ); w_format := w_temp||'拾'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-2,1) ); w_format := w_temp||'佰'||w_format; END IF; ELSIF SUBSTR(w_amt,w_length-3,1) <> 0 THEN IF SUBSTR(w_amt,w_length-2,1) = 0 THEN IF SUBSTR(w_amt,w_length-1,1) = 0 THEN IF SUBSTR(w_amt,w_length,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-1,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-1,1) ); w_format := w_temp||'拾'||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-2,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-1,1) = 0 THEN IF SUBSTR(w_amt,w_length,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-1,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-1,1) ); w_format := w_temp||'拾'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-2,1) ); w_format := w_temp||'佰'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-3,1) ); w_format := w_temp||'仟'||w_format; END IF; ---------------------------------------------------------| --萬位數-------------------------------------------------------| IF w_count > 4 THEN IF SUBSTR(w_amt,w_length-7,1) <> 0 OR SUBSTR(w_amt,w_length-6,1) <> 0 OR SUBSTR(w_amt,w_length-5,1) <> 0 OR SUBSTR(w_amt,w_length-4,1) <> 0 THEN w_format := '萬'||w_format; END IF; IF SUBSTR(w_amt,w_length-7,1) = 0 THEN IF SUBSTR(w_amt,w_length-6,1) = 0 THEN IF SUBSTR(w_amt,w_length-5,1) = 0 THEN IF SUBSTR(w_amt,w_length-4,1) = 0 THEN w_format := w_format; --w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); --w_format := w_temp||w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-4,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-5,1) ); w_format := w_temp||'拾'||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-5,1) = 0 THEN IF SUBSTR(w_amt,w_length-4,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-5,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-4,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-5,1) ); w_format := w_temp||'拾'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-6,1) ); w_format := w_temp||'佰'||w_format; END IF; ELSIF SUBSTR(w_amt,w_length-7,1) <> 0 THEN IF SUBSTR(w_amt,w_length-6,1) = 0 THEN IF SUBSTR(w_amt,w_length-5,1) = 0 THEN IF SUBSTR(w_amt,w_length-4,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-5,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-4,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-5,1) ); w_format := w_temp||'拾'||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-6,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-5,1) = 0 THEN IF SUBSTR(w_amt,w_length-4,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-5,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-4,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-4,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-5,1) ); w_format := w_temp||'拾'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-6,1) ); w_format := w_temp||'佰'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-7,1) ); w_format := w_temp||'仟'||w_format; END IF; END IF; ---------------------------------------------------------| --億位數-------------------------------------------------------| IF w_count > 8 THEN w_format := '億'||w_format; IF SUBSTR(w_amt,w_length-11,1) = 0 THEN IF SUBSTR(w_amt,w_length-10,1) = 0 THEN IF SUBSTR(w_amt,w_length-9,1) = 0 THEN IF SUBSTR(w_amt,w_length-8,1) = 0 THEN w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-8,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-9,1) ); w_format := w_temp||'拾'||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-9,1) = 0 THEN IF SUBSTR(w_amt,w_length-8,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-9,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-8,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-9,1) ); w_format := w_temp||'拾'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-10,1) ); w_format := w_temp||'佰'||w_format; END IF; ELSIF SUBSTR(w_amt,w_length-11,1) <> 0 THEN IF SUBSTR(w_amt,w_length-10,1) = 0 THEN IF SUBSTR(w_amt,w_length-9,1) = 0 THEN IF SUBSTR(w_amt,w_length-8,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-9,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-8,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-9,1) ); w_format := w_temp||'拾'||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-10,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-9,1) = 0 THEN IF SUBSTR(w_amt,w_length-8,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; w_temp := f_trans_code( SUBSTR(w_amt,w_length-9,1) ); w_format := w_temp||w_format; END IF; ELSE IF SUBSTR(w_amt,w_length-8,1) = 0 THEN w_format := w_format; ELSE w_temp := f_trans_code( SUBSTR(w_amt,w_length-8,1) ); w_format := w_temp||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-9,1) ); w_format := w_temp||'拾'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-10,1) ); w_format := w_temp||'佰'||w_format; END IF; w_temp := f_trans_code( SUBSTR(w_amt,w_length-11,1) ); w_format := w_temp||'仟'||w_format; END IF; END IF; ---------------------------------------------------------| IF w_minus_flag = 'Y' THEN w_format := '負 '||w_format||'元整'; ELSE w_format := w_format||'元整'; END IF; IF NVL(form_amt, 0) = 0 THEN w_format := '零元整'; END IF; RETURN w_format; END f_chinese_amt; ```