日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【oracle】中文数字转阿拉伯数字

發布時間:2023/12/31 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【oracle】中文数字转阿拉伯数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡體中文數字轉阿拉伯數字,分為兩個存儲過程,一個是處理小數位的,一個是處理整數位的,加入部分檢錯處理,沒有窮舉所有非法輸入,支持數據大小為:number型支持到多少就支持到多少,這是個寫得比較好的轉換方法,不過當遇到如10000 0000 0000 0000 這么大的數字,我的習慣是稱之為“一萬萬億”,可能有人認為應該叫做“一億億”,那就一習慣問題,改起來也不難,有需要再改吧。

? --將中文數字轉為阿拉伯小數
? function cnNum2AraDec(p_cnNum string) return number is
??? v_cnNum varchar2(255);
??? t_cnNum varchar(4);
??? v_dec?? varchar2(255);
??? v_num?? number;
? begin
??? if p_cnNum is not null then
????? if instr(p_cnNum, '點') > 1 then
??????? v_cnNum := substr(p_cnNum, instr(p_cnNum, '點') + 1);
??????? for i in 1 .. length(v_cnNum) loop
????????? t_cnNum := substr(v_cnNum, i, 1);
????????? begin
??????????? v_dec := v_dec || case
?????????????????????? when t_cnNum = '一' then
??????????????????????? 1
?????????????????????? when t_cnNum = '二' then
??????????????????????? 2
?????????????????????? when t_cnNum = '三' then
??????????????????????? 3
?????????????????????? when t_cnNum = '四' then
??????????????????????? 4
?????????????????????? when t_cnNum = '五' then
??????????????????????? 5
?????????????????????? when t_cnNum = '六' then
??????????????????????? 6
?????????????????????? when t_cnNum = '七' then
??????????????????????? 7
?????????????????????? when t_cnNum = '八' then
??????????????????????? 8
?????????????????????? when t_cnNum = '九' then
??????????????????????? 9
?????????????????????? when t_cnNum = '〇' then
??????????????????????? 0
???????????????????? end; --出現這十個數字以外的將報錯
????????? exception
??????????? when others then
????????????? raise_application_error(-20999, '非法中文數字!');
????????? end;
??????? end loop;
??????? v_num := to_number('0.' || v_dec);
??????? if instr(p_cnNum, '負') = 1 then
????????? v_num := -v_num;
??????? end if;
??????? return v_num;
????? else
??????? return null;
????? end if;
??? else
????? return null;
??? end if;
? end;


? --將中文數字轉為阿拉伯整數
? function cnNum2AraInt(p_cnNum string) return number is
??? i??????? pls_integer;
??? v_cnPNum varchar2(255); --整數部分
??? t_araNum number;
??? s_araNum number := 0;
??? t_cnNum? varchar(4);
??? t2_cnNum varchar2(4);
??? len????? pls_integer;
??? dn?????? pls_integer; --十的次數,為空時不用檢錯,為0時需要檢查數字相連接的錯誤輸入
??? wn?????? pls_integer := 0; --萬的次數
? begin
??? if instr(p_cnNum, '點') > 0 then
????? v_cnPNum := substr(p_cnNum, 1, instr(p_cnNum, '點') - 1);
??? else
????? v_cnPNum := p_cnNum;
??? end if;
??
??? if instr(v_cnPNum, '負') = 1 then
????? v_cnPNum := substr(v_cnPNum, 2);
??? end if;
??
??? --如果以'十'開頭,則在前面補'一'
??? if substr(v_cnPNum, 1, 1) = '十' then
????? v_cnPNum := '一' || v_cnPNum;
??? end if;
??
??? len := length(v_cnPNum);
??? i?? := len;
??? loop
????? exit when i <= 0;
????? t_cnNum := substr(v_cnPNum, i, 1);
????? if t_cnNum in ('十', '百', '千') and dn > 0 then
??????? raise_application_error(-20999, '非法中文數字!'); --當出現"十百千"相連接時,為非法中文數字
????? end if;
????? case
??????? when t_cnNum = '十' then
????????? dn := 1;
????????? i? := i - 1;
??????? when t_cnNum = '百' then
????????? dn := 2;
????????? i? := i - 1;
??????? when t_cnNum = '千' then
????????? dn := 3;
????????? i? := i - 1;
??????? when t_cnNum = '萬' then
????????? dn := null;
????????? wn := nvl(wn, 0) + 1;
????????? i? := i - 1;
??????? when t_cnNum = '億' then
????????? dn := null;
????????? wn := 2;
????????? i? := i - 1;
??????? else
????????? if t_cnNum in
???????????? ('一', '兩', '二', '三', '四', '五', '六', '七', '八', '九') and dn = 0 then
??????????? raise_application_error(-20999, '非法中文數字!'); --當出現"一二三四..."相連接時,為非法中文數字
????????? end if;
????????? t_araNum := case
??????????????????????? when t_cnNum = '一' then
???????????????????????? 1
??????????????????????? when t_cnNum = '二' then
???????????????????????? 2
??????????????????????? when t_cnNum = '兩' then
???????????????????????? 2
??????????????????????? when t_cnNum = '三' then
???????????????????????? 3
??????????????????????? when t_cnNum = '四' then
???????????????????????? 4
??????????????????????? when t_cnNum = '五' then
???????????????????????? 5
??????????????????????? when t_cnNum = '六' then
???????????????????????? 6
??????????????????????? when t_cnNum = '七' then
???????????????????????? 7
??????????????????????? when t_cnNum = '八' then
???????????????????????? 8
??????????????????????? when t_cnNum = '九' then
???????????????????????? 9
??????????????????????? when t_cnNum = '〇' then
???????????????????????? 0
????????????????????? end;
????????? if t_araNum is null then
??????????? --不在所有有效中文數字中,則報錯
??????????? raise_application_error(-20999, '非法中文數字!');
????????? elsif t_araNum is not null then
??????????? s_araNum := s_araNum + t_araNum * power(10, nvl(dn, 0)) *
??????????????????????? power(10000, nvl(wn, 0));
??????????? i??????? := i - 1;
??????????? dn?????? := 0; --重置十的次數為0;
??????????? t_araNum := null;
????????? end if;
????? end case;
??? end loop;
??? if instr(p_cnNum, '負') = 1 then
????? s_araNum := -s_araNum;
??? end if;
??? return s_araNum;
? end;


? --將中文數字轉為阿拉伯數字
? function cnNumtoAraNum(p_cnnum string) return number is
? begin
??? return nvl(cnNum2AraInt(p_cnnum), 0) + nvl(cnNum2AraDec(p_cnnum), 0);
? end;

總結

以上是生活随笔為你收集整理的【oracle】中文数字转阿拉伯数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。