oracle實現阿拉伯數字轉化為大寫漢字的函式
oracle實現阿拉伯數字轉化為大寫漢字的函式
ysj51250942011-10-28 20:34:331115收藏 分類專欄:oraclePL SQL文章標籤:oraclefunction數字轉換大寫今天工作中遇到了要改貨幣金額轉換為大寫顯示的需求,找到了一些前輩們的程式碼,總結了一下貼出來,以備以後檢視學習使用.
1.專門用於轉化年份的函式TO_UPPER_YEAR.
-
CREATE OR REPLACE FUNCTION TO_UPPER_YEAR(YEAR_IN IN VARCHAR2)
-
RETURN VARCHAR2
-
/**
-
*年轉化為大寫漢字的函式 如將2008轉換為二〇〇八
-
*月份和日期轉換的可以呼叫 TO_UPPER_NUM 函式
-
*如SELECT TO_UPPER_NUM('21','2','2') FROM DUAL
-
*查詢系統大寫年月日如下:
-
*SELECT TO_UPPER_YEAR(TO_CHAR(SYSDATE,'YYYY')) || '年' ||
-
* TO_UPPER_NUM(TO_CHAR(SYSDATE,'MM'),'2','2') || '月' ||
-
* TO_UPPER_NUM(TO_CHAR(SYSDATE,'DD'),'2','2') || '日' SJ
-
*FROM DUAL
-
*/
-
IS
-
TEMP VARCHAR2(32767);
-
RESULT VARCHAR2(32767);
-
STR VARCHAR2(32767) := '〇一二三四五六七八九';
-
BEGIN
-
IF YEAR_IN IS NULL THEN
-
RETURN NULL;
-
END IF;
-
FOR I IN 1 .. LENGTH(YEAR_IN)
-
LOOP
-
SELECT SUBSTR(STR, SUBSTR
(YEAR_IN,I, 1) + 1, 1)
-
INTO TEMP
-
FROM DUAL;
-
RESULT := RESULT || TEMP;
-
END LOOP;
-
RETURN RESULT;
-
EXCEPTION
-
WHEN OTHERS THEN
-
DBMS_OUTPUT.PUT_LINE(SQLERRM);
-
RETURN '';
-
END;
2.用於阿拉伯數字轉化為大寫漢字的函式TO_UPPER_NUM.
-
CREATE OR REPLACE FUNCTION TO_UPPER_NUM
-
(
-
P_NUM IN NUMBER DEFAULT NULL,
-
P_ROUND NUMBER DEFAULT 2, --輸出要保留的小數位數
-
P_MONTH NUMBER DEFAULT 1 --輸出不為月份或者日時,當此引數輸入不為1時,返回值為大寫(非漢字)數字
-
)
-
RETURN NVARCHAR2
-
IS
-
/**
-
*阿拉伯數字轉化為大寫漢字的函式
-
*輸入引數轉換前的數字,要保留的小數位數(4舍5入可以不輸入,預設為小數點後2位)
-
*輸出引數為轉化後的大寫數字
-
*支援小數點和負數,但數字整數部分不能超過16位
-
*支援轉換月份和日期,如 SELECT TO_UPPER_NUM('31','3','2') FROM DUAL
-
*--日期例子(年份的轉換見另一個函式)
-
* SELECT TO_UPPER_YEAR(TO_CHAR(SYSDATE,'YYYY')) || '年' ||
-
* TO_UPPER_NUM(TO_CHAR(SYSDATE,'MM'),'2','2') || '月' ||
-
* TO_UPPER_NUM(TO_CHAR(SYSDATE,'DD'),'2','2') || '日'
-
* FROM DUAL ;
-
*--貨幣例子(擷取小數點後兩位,四捨五入)
-
* SELECT TO_UPPER_NUM(1234.564) FROM dual ;
-
*/
-
RESULT NVARCHAR2(100) := ''; --返回大寫漢字字串
-
NUM_ROUND NVARCHAR2(100) := TO_CHAR(ABS(ROUND(P_NUM, P_ROUND))); --轉換數字為小數點後p_round位的字元(正數)
-
NUM_LEFT NVARCHAR2(100); --小數點左邊的數字
-
NUM_RIGHT NVARCHAR2(100); --小數點右邊的數字
-
STR1 NCHAR(10) := '零壹貳叄肆伍陸柒捌玖'; --數字大寫
-
STR2 NCHAR(16) := '點拾佰仟萬拾佰仟億拾佰仟萬拾佰仟'; --數字位數(從低至高)
-
STR3 NCHAR(10) := '〇一二三四五六七八九'; --月份數字大寫
-
STR4 NCHAR(16) := '點十佰仟萬拾佰仟億拾佰仟萬拾佰仟'; --數字位數(從低至高)
-
NUM_PRE NUMBER(1) := 1; --前一位上的數字
-
NUM_CURRENT NUMBER(1); --當前位上的數字
-
NUM_COUNT NUMBER := 0; --當前數字位數
-
BEGIN
-
--轉換數字為NULL時,返回NULL
-
IF P_NUM IS NULL THEN
-
RETURN NULL;
-
END IF;
-
--如果要轉換月份或者日時,則替換臨時變數
-
IF P_MONTH <> 1 THEN
-
STR1 := STR3;
-
STR2 := STR4;
-
END IF;
-
--取得小數點左邊的數字
-
SELECT TO_CHAR(NVL(SUBSTR(TO_CHAR(NUM_ROUND),
-
1,
-
DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),
-
0,
-
LENGTH(NUM_ROUND),
-
INSTR(TO_CHAR(NUM_ROUND), '.') - 1)),
-
0))
-
INTO NUM_LEFT
-
FROM DUAL;
-
--取得小數點右邊的數字
-
SELECT SUBSTR(TO_CHAR(NUM_ROUND),
-
DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),
-
0,
-
LENGTH(NUM_ROUND) + 1,
-
INSTR(TO_CHAR(NUM_ROUND), '.') + 1),
-
P_ROUND)
-
INTO NUM_RIGHT
-
FROM DUAL;
-
--數字整數部分超過16位時.採用從低至高的演算法,先處理小數點左邊的數字
-
IF LENGTH(NUM_LEFT) > 16 THEN
-
RETURN '**********';
-
END IF;
-
FOR I IN REVERSE 1 .. LENGTH(NUM_LEFT) LOOP
-
--(從低至高)
-
NUM_CURRENT := TO_NUMBER(SUBSTR(NUM_LEFT, I, 1)); --當前位上的數字
-
NUM_COUNT := NUM_COUNT + 1; --當前數字位數
-
--當前位上數字不為0按正常處理
-
IF NUM_CURRENT > 0 THEN
-
--如果轉換數字最高位是十位,轉換後不需要前面的壹,如月份12轉換後為拾貳,則
-
IF NUM_CURRENT = 1 AND P_MONTH <> 1 AND NUM_COUNT = 2 THEN
-
RESULT := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;
-
STR1 := STR3;
-
ELSE
-
RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1)
-
||SUBSTR(STR2, NUM_COUNT, 1)
-
|| RESULT;
-
END IF;
-
ELSE
-
--當前位上數字為0時
-
IF MOD(NUM_COUNT - 1, 4) = 0 THEN
-
--當前位是點、萬或億時
-
RESULT := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;
-
NUM_PRE := 0; --點、萬,億前不準加零
-
END IF;
-
IF NUM_PRE > 0 OR LENGTH(NUM_LEFT) = 1 THEN
-
--上一位數字不為0或只有個位時
-
RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1) || RESULT;
-
END IF;
-
END IF;
-
NUM_PRE := NUM_CURRENT;
-
END LOOP;
-
--再處理小數點右邊的數字
-
IF LENGTH(NUM_RIGHT) > 0 THEN
-
FOR I IN 1 .. LENGTH(NUM_RIGHT) LOOP
-
--(從高至低)
-
NUM_CURRENT := TO_NUMBER(SUBSTR(NUM_RIGHT, I, 1)); --當前位上的數字
-
RESULT := RESULT || SUBSTR(STR1, NUM_CURRENT + 1, 1);
-
END LOOP;
-
ELSE
-
RESULT := REPLACE(RESULT, '點', ''); --無小數時去掉點
-
END IF;
-
--轉換數字是負數時
-
IF P_NUM < 0 THEN
-
RESULT := '負' || RESULT;
-
END IF;
-
RETURN RESULT;
-
EXCEPTION
-
WHEN OTHERS THEN
-
DBMS_OUTPUT.PUT_LINE(SQLERRM);
-
RETURN '';
-
END;
--
相關推薦
oracle實現阿拉伯數字轉化為大寫漢字的函式
oracle實現阿拉伯數字轉化為大寫漢字的函式 ysj51250942011-10-28 20:34:331115收藏 分類專欄:oraclePL
阿拉伯數字轉化為漢字繁體大寫(財務金額大寫)和漢字小寫解決方案
/** * 將阿拉伯整數轉化成漢字小寫 支援12位整數 * @param n 為整數型 number 或者 string
Java將日期轉化為大寫格式(阿拉伯大寫數字)
效果: 程式碼部分: public static void main(String[] args) {SimpleDateFormat sdf=new SimpleDateFormat(\"yyyy-MM-dd\");String beforedate=sdf.format(new Date());System.out.println(\"轉換之前:\"+before
阿拉伯數字轉換為中文數字[java實現]
在網上沒有看到特別完善的阿拉伯數字轉換為中文大寫的程式碼,這裡貼一下,注意int最大隻能表示21億,需要更大數值轉換的話需要將int改成long。
JS將阿拉伯數字轉換為漢字
指令碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
Python 如何優雅的將數字轉化為時間格式的方法
將數字轉化成時間格式 from dateutil.parser import parse a=20170825 b=str(a) c=parse(b) print(c) 2017-08-25 00:00:00
用遞迴函式實現樹形結構轉化為列表資料
題目: 將下面的樹結構的資料轉化為列表的資料。 [ { \"name\": \"北京市\", \"code\": \"11\", \"children\": [ { \"name\": \"市轄區\", \"code\": \"1101\", \"children\": [ { \"name\": \"東城區\", \"code\"
[轉]C語言把數字轉換為字串的函式
博主原文 C語言itoa()函式和atoi()函式詳解(整數轉字元C實現) C語言提供了幾個標準庫函式,可以將任意型別(整型、長整型、浮點型等)的數字轉換為字串。
pandas factorize實現將字串特徵轉化為數字特徵
將原始資料中的字串特徵轉化為模型可以識別的數字特徵可是使用pandas自帶的factorzie方法。
C++ opencv實現的把藍底照片轉化為白底照片功能完整示例
本文例項講述了C++ opencv實現的把藍底照片轉化為白底照片功能。分享給大家供大家參考,具體如下:
oracle普通錶轉化為分割槽表的方法
上一篇文章中我們瞭解了oracle資料與文字匯入匯出原始碼示例的相關內容,接下來我們看看,oracle中如何將普通錶轉化為分割槽表的方法。
Python將列表中的元素轉化為數字並排序的示例
本文例項講述了Python中列表元素轉為數字的方法。分享給大家供大家參考,具體如下:
Python實現將藍底照片轉化為白底照片功能完整例項
本文例項講述了Python實現將藍底照片轉化為白底照片功能。分享給大家供大家參考,具體如下:
python將字母轉化為數字例項方法
python如何將字母轉化為數字? 將英文字母轉成數字: 轉換 ord(\'F\') 反轉 chr(70) python ord() 函式
MNIST資料集轉化為二維圖片的實現示例
本文介紹了MNIST資料集轉化為二維圖片的實現示例,分享給大家,具體如下:
Python實現列表中非負數保留,負數轉化為指定的數值方式
簡單的小練習,實現將一個指定列表中的數值進行轉化,對於其中的非負數不作處理,對於負數需要轉化為制定的數值,很簡單就不多說了,下面是具體的實現:
python轉化excel數字日期為標準日期操作
夥伴遇到一個關於excel匯入資料到python中,日期變成數字而不是日期格式的問題。第一反應這個數字應該是excel裡面的時間戳類似的,所以我就實驗增加一天是不是對應的數字就加1。最後證明了我的想法,這樣就可以倒推e
Oracle中對數字加漢字的排序
需求:有一列NAME, varchar2型別,內容如下 以上就是已經按order by name進行排序的,但不是我們想要的結果
數字金額轉變成大寫漢字金額
/** * @desc 金額轉換成大寫 * @param {Number} n 需要轉換成大寫的金額 * @return {String} 轉換後的大寫中文金額
js實現數字轉換為逗號分隔的格式化字串
//注意:數字與字元的轉換會丟失多餘的尾部0(\'123.010\'<->123.01,\'123.00\'<->123)