码迷,mamicode.com
首页 > 其他好文 > 详细

返回人民币大写方式(num2rmb)

时间:2015-04-14 19:32:57      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

    1. CREATE OR REPLACE FUNCTION num2rmb(Pi_MONEY NVARCHAR2) RETURN NVARCHAR2 IS
    2. -- PURPOSE :返回人民币大写方式
    3. v_NUM NUMBER;
    4. I NUMBER;
    5. J NUMBER;
    6. K NUMBER;
    7. L NUMBER;
    8. FS1 NVARCHAR2(500);
    9. FS2 NVARCHAR2(500);
    10. FS3 NVARCHAR2(500);
    11. S NVARCHAR2(500);
    12. S1 NVARCHAR2(500);
    13. S2 NVARCHAR2(500);
    14. ZERO NUMBER;
    15. POS NUMBER;
    16. H NUMBER;
    17. T NUMBER(5, 4);
    18. v_money NUMBER;
    19. BEGIN
    20. v_money := round(Pi_MONEY, 2);
    21. IF NVL(v_money, 0) = 0
    22. OR INSTR(v_money, ‘.‘) >= 18 THEN
    23. RETURN ‘无‘;
    24. END IF;
    25. ZERO := 0;
    26. POS := 0;
    27. FS1 := ‘零壹贰叁肆伍陆柒捌玖‘;
    28. FS2 := ‘仟佰拾万仟佰拾元‘;
    29. FS3 := ‘仟佰拾万仟佰拾亿‘;
    30. H := TRUNC(v_money); ---整数部分
    31. T := v_money - H; ---小数部分
    32. IF T = 0 THEN
    33. ---形成字符串
    34. S := LPAD(TO_CHAR(H), 16, 0) || ‘.0000;
    35. ELSE
    36. S := LPAD(TO_CHAR(H), 16, 0) || RPAD(TO_CHAR(T), 5, 0);
    37. END IF;
    38. S1 := SUBSTR(S, 1, 8) || ‘.‘;
    39. --整理亿位数字
    40. FOR I IN 1 .. 8 LOOP
    41. IF I >= POS THEN
    42. --- else skip 0
    43. L := TO_NUMBER(SUBSTR(S1, I, 1));
    44. IF L > 0 THEN
    45. --add fs1 and fs2 char
    46. S2 := S2 || SUBSTR(FS1, L + 1, 1) || SUBSTR(FS3, I, 1);
    47. ZERO := 1; --有整数
    48. ELSE
    49. IF I = 4 THEN
    50. S2 := S2 || ‘万‘;
    51. END IF; ---插入万字,因为从此出分隔一次循环
    52. POS := I + 1;
    53. FOR J IN I + 1 .. 9 LOOP
    54. IF J = 4
    55. AND SUBSTR(S1, J, 1) = 0
    56. AND S2 IS NOT NULL
    57. AND ZERO = 1 THEN
    58. S2 := S2 || ‘万‘;
    59. END IF;
    60. IF SUBSTR(S1, J, 1) = 0 THEN
    61. POS := POS + 1;
    62. END IF;
    63. EXIT WHEN SUBSTR(S1, J, 1) != 0; --POS >= 9;
    64. END LOOP;
    65. IF POS = 9
    66. AND SUBSTR(S1, 1, 8) >= 1 THEN
    67. S2 := S2 || ‘亿‘; --无个亿位,直接加亿
    68. ELSE
    69. IF ZERO = 1 THEN
    70. S2 := S2 || ‘零‘;
    71. END IF; --不到个亿位,补中间零 eg 10101
    72. END IF;
    73. END IF;
    74. END IF;
    75. END LOOP;
    76. ZERO := 0;
    77. POS := 0;
    78. --整理亿位之后的数据
    79. S1 := SUBSTR(S, 9);
    80. FOR I IN 1 .. 8 LOOP
    81. IF I = 1
    82. AND TO_NUMBER(SUBSTR(S1, I, 1)) = 0
    83. AND S2 IS NOT NULL THEN
    84. S2 := S2 || ‘零‘;
    85. END IF;
    86. IF I >= POS THEN
    87. --- else skip 0
    88. L := TO_NUMBER(SUBSTR(S1, I, 1));
    89. IF L > 0 THEN
    90. --add fs1 and fs2 char
    91. S2 := S2 || SUBSTR(FS1, L + 1, 1) || SUBSTR(FS2, I, 1);
    92. ZERO := 1; --有整数
    93. ELSE
    94. IF I = 4 THEN
    95. S2 := S2 || ‘万‘;
    96. END IF; ---插入万字,因为从此出分隔一次循环
    97. POS := I + 1;
    98. FOR J IN I + 1 .. 9 LOOP
    99. IF J = 4
    100. AND SUBSTR(S1, J, 1) = 0
    101. AND S2 IS NOT NULL
    102. AND ZERO = 1 THEN
    103. S2 := S2 || ‘万‘;
    104. END IF;
    105. IF SUBSTR(S1, J, 1) = 0 THEN
    106. POS := POS + 1;
    107. END IF;
    108. EXIT WHEN SUBSTR(S1, J, 1) != 0;
    109. END LOOP;
    110. IF POS = 9
    111. AND v_money >= 1 THEN
    112. S2 := S2 || ‘元‘; --无个位,直接加元
    113. ELSE
    114. IF ZERO = 1 THEN
    115. S2 := S2 || ‘零‘;
    116. END IF; --不到个位,补中间零 eg 10101.00
    117. END IF;
    118. END IF;
    119. END IF;
    120. END LOOP;
    121. IF SUBSTR(S1, 10, 4) = 0000 THEN
    122. S2 := S2 || ‘整‘;
    123. ELSE
    124. L := TO_NUMBER(SUBSTR(S1, 10, 1));
    125. IF L > 0 THEN
    126. S2 := S2 || SUBSTR(FS1, L * 1 + 1, 1) || ‘角‘;
    127. ELSE
    128. IF v_money > 0.1 THEN
    129. S2 := S2 || ‘零‘;
    130. END IF; --去掉0.01的前导零
    131. END IF;
    132. L := TO_NUMBER(SUBSTR(S1, 11, 1));
    133. IF L > 0 THEN
    134. S2 := S2 || SUBSTR(FS1, L * 1 + 1, 1) || ‘分‘;
    135. END IF;
    136. END IF;
    137. RETURN S2;
    138. END num2rmb;





返回人民币大写方式(num2rmb)

标签:

原文地址:http://www.cnblogs.com/mellowsmile/p/4425806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!