utils.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //加法函数,用来得到精确的加法结果
  2. export function accAdd(arg1: any,arg2: any){
  3. var r1,r2,m;
  4. try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  5. try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  6. m=Math.pow(10,Math.max(r1,r2))
  7. return (arg1*m+arg2*m)/m
  8. }
  9. //减法函数,用来得到精确的加法结果
  10. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  11. //调用:accAdd(arg1,arg2)
  12. //返回值:arg1加上arg2的精确结果
  13. export function accSub(arg1: any,arg2: any){
  14. var r1,r2,m,n;
  15. try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  16. try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  17. m=Math.pow(10,Math.max(r1,r2));
  18. //动态控制精度长度
  19. n=(r1>=r2)?r1:r2;
  20. return ((arg1*m-arg2*m)/m).toFixed(n);
  21. }
  22. //乘法函数
  23. export function accMul(arg1:any, arg2:any){
  24. var t1 = 0, t2 = 0,s1 = arg1.toString(), s2 = arg2.toString(),r1,r2;
  25. try {t1= s1.split(".")[1].length;}catch (e) {}
  26. try {t2= s2.split(".")[1].length;}catch (e) {}
  27. r1 = Number(s1.replace(".", ""));
  28. r2 = Number(s2.replace(".", ""));
  29. return r1 * r2 / Math.pow(10, t1+t2);
  30. }
  31. // 除法
  32. export function accDiv(arg1:any, arg2:any) {
  33. var t1 = 0, t2 = 0, s1 = arg1.toString(), s2 = arg2.toString(),r1,r2;
  34. try {t1 = s1.split(".")[1].length;}catch (e) {}
  35. try {t2 = s2.split(".")[1].length;}catch (e) {}
  36. r1 = Number(s1.replace(".", ""));
  37. r2 = Number(s2.replace(".", ""));
  38. return (r1 / r2) * Math.pow(10, t2 - t1);
  39. }
  40. /**
  41. * 格式化数字
  42. * @param num 要格式化的数字
  43. * @param len 保留小数位数默认2
  44. * @param type 格式化方式0:四舍五入 1:进一 2:舍去 默认0
  45. * @return string
  46. */
  47. export function format_number(num:any,len:any,type:any) {
  48. len = len > 0 && len <= 20 ? len : 2;
  49. var result = parseFloat(num);
  50. num=isNaN(result)?0:result;
  51. var numpow=Math.pow(10,len);
  52. var numcheng=accMul(num,numpow);
  53. if(type==1){//ceil进一
  54. result = Math.ceil(numcheng);
  55. }else if(type==2){//floor舍去
  56. result = Math.floor(numcheng);
  57. }else{//round四舍五入
  58. result = Math.round(numcheng);
  59. }
  60. result =accDiv(result,numpow);
  61. var s_x = result.toString();
  62. var pos_decimal = s_x.indexOf('.');
  63. if (pos_decimal < 0) {pos_decimal = s_x.length;s_x += '.';}
  64. while (s_x.length <= pos_decimal + len) {s_x += '0';}
  65. return s_x;
  66. }
  67. export function Arabia_To_SimplifiedChinese(Num: any): any {
  68. for (let i = Num.length - 1; i >= 0; i--) {
  69. Num = Num.replace(',', '');// 替换Num中的“,”
  70. Num = Num.replace(' ', '');// 替换Num中的空格
  71. }
  72. // 验证输入的字符是否为数字
  73. if (isNaN(Num)) {
  74. alert('请检查小写金额是否正确');
  75. return;
  76. }
  77. // 字符处理完毕后开始转换,采用前后两部分分别转换(小数点为界限)
  78. var part = String(Num).split('.');
  79. // 初始化一个字符串
  80. var newchar = '';
  81. // 小数点前进行转化
  82. for (let i = part[0].length - 1; i >= 0; i--) {
  83. // 若数量超过拾亿单位,提示
  84. if (part[0].length > 10) {
  85. // alert("位数过大,无法计算");
  86. return '';
  87. }
  88. let tmpnewchar:string = '';
  89. let perchar:any = part[0].charAt(i);
  90. switch (perchar) {
  91. case '0': tmpnewchar = '零' + tmpnewchar; break;
  92. case '1': tmpnewchar = '一' + tmpnewchar; break;
  93. case '2': tmpnewchar = '二' + tmpnewchar; break;
  94. case '3': tmpnewchar = '三' + tmpnewchar; break;
  95. case '4': tmpnewchar = '四' + tmpnewchar; break;
  96. case '5': tmpnewchar = '五' + tmpnewchar; break;
  97. case '6': tmpnewchar = '六' + tmpnewchar; break;
  98. case '7': tmpnewchar = '七' + tmpnewchar; break;
  99. case '8': tmpnewchar = '八' + tmpnewchar; break;
  100. case '9': tmpnewchar = '九' + tmpnewchar; break;
  101. }
  102. switch (part[0].length - i - 1) {
  103. case 0: tmpnewchar = tmpnewchar; break;
  104. case 1: if (perchar != 0) tmpnewchar = tmpnewchar + '十'; break;
  105. case 2: if (perchar != 0) tmpnewchar = tmpnewchar + '百'; break;
  106. case 3: if (perchar != 0) tmpnewchar = tmpnewchar + '千'; break;
  107. case 4: tmpnewchar = tmpnewchar + '万'; break;
  108. case 5: if (perchar != 0) tmpnewchar = tmpnewchar + '十'; break;
  109. case 6: if (perchar != 0) tmpnewchar = tmpnewchar + '百'; break;
  110. case 7: if (perchar != 0) tmpnewchar = tmpnewchar + '千'; break;
  111. case 8: tmpnewchar = tmpnewchar + '亿'; break;
  112. case 9: tmpnewchar = tmpnewchar + '十'; break;
  113. }
  114. newchar = tmpnewchar + newchar;
  115. }
  116. // 替换所有无用汉字,直到没有此类无用的数字为止
  117. while (newchar.search('零零') != -1 || newchar.search('零亿') != -1 || newchar.search('亿万') != -1 || newchar.search('零万') != -1) {
  118. newchar = newchar.replace('零亿', '亿');
  119. newchar = newchar.replace('亿万', '亿');
  120. newchar = newchar.replace('零万', '万');
  121. newchar = newchar.replace('零零', '零');
  122. }
  123. // 替换以“一十”开头的,为“十”
  124. if (newchar.indexOf('一十') == 0) {
  125. newchar = newchar.substr(1);
  126. }
  127. // 替换以“零”结尾的,为“”
  128. if (newchar.lastIndexOf('零') == newchar.length - 1) {
  129. newchar = newchar.substr(0, newchar.length - 1);
  130. }
  131. return newchar;
  132. }