瀏覽代碼

解决计算精度问题和百分比位数移动的最大限制

Karsa 1 年之前
父節點
當前提交
25b37b1828

+ 29 - 38
src/views/datasheet_manage/common/customTable.js

@@ -1,3 +1,4 @@
+import { multiply,divide } from '@/utils/calculate';
 // 字母列标
 export function getColumnHeaderCode(len) {
   let tag_arr = [];
@@ -271,15 +272,26 @@ export function isNumberVal(value) {
 }
 
 /* 增加减少小数点位数 */
-export function transDecimalPlace(str,decimalNum) {
-  console.log(str,decimalNum)
-  let s = str.replace(/%/,''), decimalPlaces = getDecimalPlaces(str);
+export function transDecimalPlace(str,{pn,nt}) {
+  let s = str.replace(/%/,''),
+      decimalPlaces = getDecimalPlaces(str),
+      decimalNum=pn;
+  
+  //是否是设置百分比后的
+  let transPercent = nt==='percent' ? true : false;
 
   //后缀 百分号
-  let suffix = str.endsWith('%') ? '%' : '';
+  let suffix = (str.endsWith('%')||transPercent) ? '%' : '';
 
   let num = parseFloat(s);
+
   if(decimalPlaces===0) { //整数
+    if(transPercent) {
+      return decimalNum > 0 
+        ? `${multiply(num,100)}.${'0'.repeat(decimalNum)}${suffix}`
+        : `${multiply(num,100)}${suffix}`;
+    }
+
     // 补零
     return decimalNum > 0 
       ? `${s}.${'0'.repeat(decimalNum)}${suffix}`
@@ -290,30 +302,19 @@ export function transDecimalPlace(str,decimalNum) {
   // decimalStr = str.split('.')[1];
 
   if(decimalNum > 0) {
-    return `${s}${'0'.repeat(decimalNum)}${suffix}`
+    let addPointStr = `${s}${'0'.repeat(decimalNum)}`;
+    
+    return transPercent 
+      ? `${parseFloat(multiply(num,100)).toFixed(decimalPlaces+decimalNum-2)}${suffix}`
+      : `${addPointStr}${suffix}`
   }else {
     let maxDecimal = Math.max(0,decimalNum+decimalPlaces);
-    return `${parseFloat(num.toFixed(maxDecimal))}${suffix}`
-  }
-
-  // if(decimalPlaces===0) { //整数
-  //   // 补零
-  //   const zerosToAdd = Math.max(0, decimalNum);
-  //   return zerosToAdd > 0 
-  //     ? `${s}.${'0'.repeat(zerosToAdd)}${suffix}`
-  //     : `${s}${suffix}`;
-  // }
+    let maxDecimalPercent = Math.max(0,maxDecimal-2);
 
-  // let integerStr = str.split('.')[0],
-  // decimalStr = str.split('.')[1];
-
-  // if(decimalNum>0) {
-  //   return `${s}${'0'.repeat(decimalNum)}${suffix}`
-  // } else {
-  //   return decimalNum+decimalPlaces > 0 
-  //     ? `${integerStr}.${decimalStr.substring(0,decimalNum+decimalPlaces)}${suffix}`
-  //     : `${integerStr}${suffix}`
-  // }
+    return transPercent 
+    ? `${parseFloat(multiply(num,100)).toFixed(maxDecimalPercent)}${suffix}`
+    : `${parseFloat(num.toFixed(maxDecimal))}${suffix}`
+  }
 }
 
 /* 计算小数点位数 */
@@ -336,7 +337,7 @@ export function getDecimalPlaces(numStr) {
 export function transNumPercentType(str,type) {
   console.log(str,type)
 
-  let isPercent = str.endsWith('%'),s=str.replace(/%/,''),decimalPlaces = getDecimalPlaces(str);
+  let isPercent = str.endsWith('%'),s=str.replace(/%/,'');
   
   if(isPercent && type==='percent') { //百分数转百分
     return str
@@ -349,19 +350,9 @@ export function transNumPercentType(str,type) {
   let num = parseFloat(s)
 
   if(type==='percent') {
-    const percenStr = (num * 100).toFixed(2) + '%';
+    const percenStr = parseFloat(multiply(num,100)) + '%';
     return percenStr;
   }else {
-    return (num/100).toFixed(2);
+    return parseFloat(divide(num,100));
   }
-}
-
-export function transValueFormat(str,{nt,pn}) {
-  let str1 = '',str2 = '';
-  
-  str1 = nt ? transNumPercentType(str,nt) : str;
-  
-  str2 = pn!==0 ? transDecimalPlace(str1,pn) : str1;
-
-  return str2;
 }

+ 5 - 1
src/views/datasheet_manage/components/MixedTable.vue

@@ -233,7 +233,7 @@ import {
   toUpperCase,
   findCellKeyByFactor,
   isNumberVal,
-  transValueFormat
+  transDecimalPlace
 } from "../common/customTable";
 import * as sheetInterface from "@/api/modules/sheetApi.js";
 import { dataBaseInterface } from '@/api/api.js';
@@ -773,6 +773,7 @@ export default {
     打开弹窗后仍可以在页面上点击 多存一个选择指标时的当前单元格信息 */
     selectTargetOpen(type) {
       this.insertTargetCell = this.selectCell;
+      resetDialogCellStyle();
       setRelationStyle({ key:this.insertTargetCell.Uid },'td-choose-insert-target')
       if(type === 'cell-edit') {
         this.insertTargetValueInfo = {
@@ -933,6 +934,7 @@ export default {
     /* 导入系统/指标日期弹窗 */
     insertDateOpen(type) {
       this.insertTargetCell = this.selectCell;
+      resetDialogCellStyle();
 
       if(type === 'cell-edit') { //编辑日期
         // const { DataTimeType } = this.insertTargetCell;
@@ -979,6 +981,7 @@ export default {
     /* 指标计算弹窗 */
     edbCalculateInsertOpen(item) {
       this.insertTargetCell = this.selectCell;
+      resetDialogCellStyle();
       setRelationStyle({ key:this.insertTargetCell.Uid },'td-choose-insert-target');
 
       if(item === 'cell-edit') { //编辑
@@ -1031,6 +1034,7 @@ export default {
     /* 日期计算弹窗 */
     insertDateCalculateOpen(type) {
       this.insertTargetCell = this.selectCell;
+      resetDialogCellStyle()
       setRelationStyle({ key:this.insertTargetCell.Uid },'td-choose-insert-target')
 
       if(type === 'cell-edit') { //编辑

+ 7 - 3
src/views/datasheet_manage/components/toolBarSection.vue

@@ -34,7 +34,7 @@
   </div>
 </template>
 <script>
-import { transDecimalPlace,isNumberVal,getDecimalPlaces,transNumPercentType,transValueFormat } from '../common/customTable';
+import { transDecimalPlace,isNumberVal,getDecimalPlaces,transNumPercentType } from '../common/customTable';
 export default {
   props: {
     cell: {
@@ -134,8 +134,12 @@ export default {
         this.option.pn = parseInt(`-${getDecimalPlaces(value)}`)
       }
 
-      let nval = transValueFormat(value,this.option)
-      // let nval = transDecimalPlace(value,this.option.pn)
+      //百分比格式的话 pn最小为位数-2
+      if(this.option.nt==='percent' && this.option.pn <= parseInt(`-${getDecimalPlaces(value)-2}`)) {
+        this.option.pn = parseInt(`-${getDecimalPlaces(value)-2}`)
+      }
+
+      let nval = transDecimalPlace(value,this.option)
       // console.log(nval)
 
       this.$emit('updateCell',{

+ 4 - 2
src/views/datasheet_manage/mixedSheetEdit.vue

@@ -99,8 +99,10 @@ export default {
       classifyArr: [],
       rules: `表格说明:<br>
         1、手动输入:单击每个单元格可直接输入文本、数字、日期(格式示例:2023-05-23),输入内容可匹配指标名称,ETA指标库和ETA预测指标库指标均可搜索,在下拉框中选择指标,则该单元格为已选指标行/列。<br>
-        2、插入指标值:右键单元格,点击“插入指标值”,则查询该单元格行、列最近的日期和指标名称,将查找到的指标对应日期的值填入该单元格,指标值总是在右下角。<br>
-        3、更新与计算规则:表格中指标值的日期不自动更新,数值不支持单元格计算`,
+        2、根据日期选择指标值:在弹窗中搜索并选择指标,默认选择指标最新日期,可插入指标值,随着指标更新;也支持选择指标后,在表格中选择或输入一个日期,则插入该指标在选定日期的值。<br>
+        3、导入日期:导入系统或指标相关的日期,可进一步进行日期变换,跟随系统日期或指标日期更新。<br>
+        4、日期计算:对表格中日期进行计算。<br>
+        5、指标计算:选择指标进行计算,插入指标计算值。`,
       sheetForm: {
         sheetType: 1
       },