money.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. //将数字转换成中文
  2. function convertCurrency(money) {
  3. //汉字的数字
  4. var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
  5. //基本单位
  6. var cnIntRadice = new Array('', '拾', '佰', '仟');
  7. //对应整数部分扩展单位
  8. var cnIntUnits = new Array('', '万', '亿', '兆');
  9. //对应小数部分单位
  10. var cnDecUnits = new Array('角', '分', '毫', '厘');
  11. //整数金额时后面跟的字符
  12. var cnInteger = '整';
  13. //整型完以后的单位
  14. var cnIntLast = '元';
  15. //最大处理的数字
  16. var maxNum = 999999999999999.9999;
  17. //金额整数部分
  18. var integerNum;
  19. //金额小数部分
  20. var decimalNum;
  21. //输出的中文金额字符串
  22. var chineseStr = '';
  23. //分离金额后用的数组,预定义
  24. var parts;
  25. //负数汉字
  26. var negative = '';
  27. if (money == '') { return ''; }
  28. money = parseFloat(money);
  29. if (money >= maxNum) {
  30. //超出最大处理数字
  31. return '';
  32. }
  33. if (money == 0) {
  34. chineseStr = cnNums[0] + cnIntLast + cnInteger;
  35. return chineseStr;
  36. }
  37. if (money < 0){
  38. money = 0 - money;
  39. negative = '负';
  40. }
  41. //转换为字符串
  42. money = money.toString();
  43. if (money.indexOf('.') == -1) {
  44. integerNum = money;
  45. decimalNum = '';
  46. } else {
  47. parts = money.split('.');
  48. integerNum = parts[0];
  49. decimalNum = parts[1].substr(0, 4);
  50. }
  51. //获取整型部分转换
  52. if (parseInt(integerNum, 10) > 0) {
  53. var zeroCount = 0;
  54. var IntLen = integerNum.length;
  55. for (var i = 0; i < IntLen; i++) {
  56. var n = integerNum.substr(i, 1);
  57. var p = IntLen - i - 1;
  58. var q = p / 4;
  59. var m = p % 4;
  60. if (n == '0') {
  61. zeroCount++;
  62. } else {
  63. if (zeroCount > 0) {
  64. chineseStr += cnNums[0];
  65. }
  66. //归零
  67. zeroCount = 0;
  68. chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
  69. }
  70. if (m == 0 && zeroCount < 4) {
  71. chineseStr += cnIntUnits[q];
  72. }
  73. }
  74. chineseStr += cnIntLast;
  75. }
  76. //小数部分
  77. if (decimalNum != '') {
  78. var decLen = decimalNum.length;
  79. for (var i = 0; i < decLen; i++) {
  80. var n = decimalNum.substr(i, 1);
  81. if (n != '0') {
  82. chineseStr += cnNums[Number(n)] + cnDecUnits[i];
  83. }
  84. }
  85. }
  86. if (chineseStr == '') {
  87. chineseStr += cnNums[0] + cnIntLast + cnInteger;
  88. } else if (decimalNum == '') {
  89. chineseStr += cnInteger;
  90. }
  91. return negative+chineseStr;
  92. }
  93. /**
  94. * 强制保留2位小数,不足补 0
  95. */
  96. function formatterNum(x) {
  97. var f = parseFloat(x);
  98. if (isNaN(f)) {
  99. return false;
  100. }
  101. var f = Math.round(x * 100) / 100;
  102. var s = f.toString();
  103. var rs = s.indexOf('.');
  104. if (rs < 0) {
  105. rs = s.length;
  106. s += '.';
  107. }
  108. while (s.length <= rs + 2) {
  109. s += '0';
  110. }
  111. return s;
  112. }
  113. function formatterNumWithStar(x){
  114. var result = formatterNum(x);
  115. var newResult = replaceStr(result, 0, result.length, '*');
  116. return newResult;
  117. }
  118. //替换某个字符串从start到end的内容为char字符
  119. function replaceStr(str,start,end, char){
  120. var len = str.length;
  121. var prev = str.substr(0, start);
  122. var latter = str.substr(end, len-end);
  123. var num = end - start;
  124. var rs = str.indexOf('.');
  125. return prev + repeatStr(char, num, rs) + latter;
  126. }
  127. //重复某个字符多次
  128. function repeatStr(char, length, rs){
  129. var str = '';
  130. for(var i=0; i<length; ++i){
  131. if(i != rs){
  132. str += char;
  133. }else{
  134. str += '.';
  135. }
  136. }
  137. return str;
  138. }
  139. /**
  140. * 将数值格式化成金额形式
  141. *
  142. * @param num 数值(Number或者String)
  143. * @param precision 精度,默认不变
  144. * @param separator 分隔符,默认为逗号
  145. * @return 金额格式的字符串,如'1,234,567',默认返回NaN
  146. * @type String
  147. */
  148. function formatNumber(num, precision, separator) {
  149. var parts;
  150. // 判断是否为数字
  151. if (!isNaN(parseFloat(num)) && isFinite(num)) {
  152. // 把类似 .5, 5. 之类的数据转化成0.5, 5, 为数据精度处理做准, 至于为什么
  153. // 不在判断中直接写 if (!isNaN(num = parseFloat(num)) && isFinite(num))
  154. // 是因为parseFloat有一个奇怪的精度问题, 比如 parseFloat(12312312.1234567119)
  155. // 的值变成了 12312312.123456713
  156. num = Number(num);
  157. // 处理小数点位数
  158. num = (typeof precision !== 'undefined' ? (Math.round(num * Math.pow(10,precision)) / Math.pow(10,precision)).toFixed(precision) : num).toString();
  159. // 分离数字的小数部分和整数部分
  160. parts = num.split('.');
  161. // 整数部分加[separator]分隔, 借用一个著名的正则表达式
  162. parts[0] = parts[0].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + (separator || ','));
  163. return parts.join('.');
  164. }
  165. return NaN;
  166. }
  167. function formatNumberNull(num, rec,index) {
  168. var precision = 2;
  169. //var separator = '';
  170. var parts;
  171. if(!num)
  172. return '--';
  173. // 判断是否为数字
  174. if (!isNaN(parseFloat(num)) && isFinite(num)) {
  175. // 把类似 .5, 5. 之类的数据转化成0.5, 5, 为数据精度处理做准, 至于为什么
  176. // 不在判断中直接写 if (!isNaN(num = parseFloat(num)) && isFinite(num))
  177. // 是因为parseFloat有一个奇怪的精度问题, 比如 parseFloat(12312312.1234567119)
  178. // 的值变成了 12312312.123456713
  179. num = Number(num);
  180. // 处理小数点位数
  181. num = (typeof precision !== 'undefined' ? (Math.round(num * Math.pow(10,precision)) / Math.pow(10,precision)).toFixed(precision) : num).toString();
  182. // 分离数字的小数部分和整数部分
  183. parts = num.split('.');
  184. // 整数部分加[separator]分隔, 借用一个著名的正则表达式
  185. //parts[0] = parts[0].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + (separator || ','));
  186. return parts.join('.');
  187. }
  188. return '--';
  189. }