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

  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;

来自为知笔记(Wiz)

时间: 2024-11-09 01:41:33

返回人民币大写方式(num2rmb)的相关文章

将一个数转化为中文金额的大写方式(有详细的解题步骤)

1 /* 2 * 程序目的: 从命令行输入一个数,并将其转化为中文金额的大写方式 3 * 思路: 4 * 所需对象:用到两个数组,一个存中文大写的数字,一个存金额单位: 5 * 为了保持精度的相对准确,用到BigDecimal类:(不懂的朋友,上网一查就知道了): 6 * 我这里用了StringBuilder类来存转化后的结果:(其实用String,StringBuffer都可以) 7 * 过程:输入一个double类型的数———>转化为BigDecimal类的对象———>四舍五入后转化为lo

java 将一个正整数翻译成人民币大写的读法

程序如下: 1 import java.lang.StringBuffer; 2 /** 3 给定一个浮点数,将其装换成人民币大写的读法 4 88.5:捌十捌元零伍角 5 */ 6 public class Num2Rmb 7 { 8 private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒",

Java实现人民币大写精讲

想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧! 本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到分 经典测试数据: 0 希望转换出来的结果为: 零元零角零分 1234 希望转换出来的结果为: 壹仟贰佰叁拾肆元零角零分 9999 希望转换出来的结果为: 玖仟玖佰玖拾玖元零角零分 1234.5 希望转换出来的结果为: 壹仟贰佰叁拾肆元伍角零分 1234.9 希望转换出来的结果为: 壹仟贰佰叁拾肆元

[转]WinExec、ShellExecute和CreateProcess及返回值判断方式

[转]WinExec.ShellExecute和CreateProcess及返回值判断方式 http://www.cnblogs.com/ziwuge/archive/2012/03/12/2392472.html 有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.CreateProcess因为使用复杂,比较少用. WinExec主要运行EXE文件. ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT u

NET 人民币大写

/***** HongShijin** [email protected]** 2009-3-15 10:13:00.00000** text/C#***/ /// <summary> /// 转换人民币大写 /// </summary> /// <param name="input">数字输入</param>  /// <returns>大写金额</returns> public static string To

JS 人民币大写

/***** HongShijin** [email protected]** 2014-10-15 9:13:00.00000** text/javascript***/ (function ($){ Number.prototype.toRmbString = function () { var c = { n: [38646, 22777, 36144, 21441, 32902, 20237, 38470, 26578, 25420, 29590, 25972, 36000], // "

Ext_两种处理服务器端返回值的方式

1.Form表单提交返回值处理 //提交基本信息表单  f.form.submit({      clientValidation:true,      //表单提交后台处理地址      url:'/globe_background/Commonality/AccountClub.ashx?action=updateuserinfoform&uid=' + jsonDate.uid,      //数据提交方式      method:'POST',                      

js 将数字转换成人民币大写的方法

//将数字转换成人民币大写的方法 var digitUppercase = function (n) { var fraction = ['角', '分']; var digit = [ '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' ]; var unit = [ ['元', '万', '亿'], ['', '拾', '佰', '仟'] ]; var IsNum = Number(n); if (!isNaN(IsNum)) { var hea

Access自定义函数(人民币大写)

人民币大写函数:整数不超过13位. Public Function 人民币大写(A) As String Dim aa As String Dim bb As String Dim cc As String Dim dd As Byte Dim ee As Boolean Dim ff As Byte Dim i As Integer Dim qq As String On Error GoTo CH_Err If A >= 0 Then aa = Int((A + 0.005) * 100)