码迷,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
迷上了代码!