|
@@ -58,7 +58,7 @@
|
|
|
style="width: 100%"
|
|
|
placeholder="请输入单价"
|
|
|
@input="validateFloatInput($event, scope.row, 'unitPrice')"
|
|
|
- @blur="handleUnitPriceChange(scope.row, scope.$index)"
|
|
|
+ @blur="validateAndFormatFloatOnBlur(scope.row, 'unitPrice'); handleUnitPriceChange(scope.row, scope.$index)"
|
|
|
/>
|
|
|
<span v-else>{{ formatUnitPrice(scope.row.unitPrice) }}</span>
|
|
|
</template>
|
|
@@ -85,7 +85,7 @@
|
|
|
style="width: 100%"
|
|
|
placeholder="请输入税率"
|
|
|
@input="validateFloatInput($event, scope.row, 'taxRate', 0, 100)"
|
|
|
- @blur="handleTaxRateChange(scope.row, scope.$index)"
|
|
|
+ @blur="validateAndFormatFloatOnBlur(scope.row, 'taxRate', 0, 100); handleTaxRateChange(scope.row, scope.$index)"
|
|
|
/>
|
|
|
<span v-else>{{ formatQuantity(scope.row.taxRate) }}%</span>
|
|
|
</template>
|
|
@@ -99,7 +99,7 @@
|
|
|
style="width: 100%"
|
|
|
placeholder="请输入税额"
|
|
|
@input="validateFloatInput($event, scope.row, 'taxAmount')"
|
|
|
- @blur="handleTaxAmountChange(scope.row, scope.$index)"
|
|
|
+ @blur="validateAndFormatFloatOnBlur(scope.row, 'taxAmount'); handleTaxAmountChange(scope.row, scope.$index)"
|
|
|
/>
|
|
|
<span v-else>{{ formatAmount(scope.row.taxAmount, false) }}</span>
|
|
|
</template>
|
|
@@ -113,7 +113,7 @@
|
|
|
style="width: 100%"
|
|
|
placeholder="请输入总金额"
|
|
|
@input="validateFloatInput($event, scope.row, 'totalAmount')"
|
|
|
- @blur="handleTotalAmountChange(scope.row, scope.$index)"
|
|
|
+ @blur="validateAndFormatFloatOnBlur(scope.row, 'totalAmount'); handleTotalAmountChange(scope.row, scope.$index)"
|
|
|
/>
|
|
|
<span v-else>{{ formatAmount(scope.row.totalAmount, false) }}</span>
|
|
|
</template>
|
|
@@ -391,7 +391,7 @@ export default {
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
- * 验证浮点数输入
|
|
|
+ * 验证浮点数输入(输入时验证)
|
|
|
* @param {string} value - 输入值
|
|
|
* @param {Object} row - 当前行数据
|
|
|
* @param {string} field - 字段名
|
|
@@ -399,8 +399,9 @@ export default {
|
|
|
* @param {number} max - 最大值
|
|
|
*/
|
|
|
validateFloatInput(value, row, field, min = 0, max = 999999.99) {
|
|
|
- // 允许空值和部分输入
|
|
|
- if (value === '' || value === '-' || value === '.') {
|
|
|
+ // 允许空值和部分输入(包括单独的小数点、负号等)
|
|
|
+ if (value === '' || value === '-' || value === '.' || value === '-.') {
|
|
|
+ row[field] = value
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -418,25 +419,44 @@ export default {
|
|
|
cleanValue = parts[0] + '.' + parts.slice(1).join('')
|
|
|
}
|
|
|
|
|
|
- // 限制小数位数为2位
|
|
|
+ // 限制小数位数为2位(但允许继续输入)
|
|
|
if (parts.length === 2 && parts[1].length > 2) {
|
|
|
cleanValue = parts[0] + '.' + parts[1].substring(0, 2)
|
|
|
}
|
|
|
|
|
|
- // 如果有有效数值,进行范围检查
|
|
|
- if (cleanValue !== '' && cleanValue !== '-' && cleanValue !== '.') {
|
|
|
- const numValue = parseFloat(cleanValue)
|
|
|
- if (!isNaN(numValue)) {
|
|
|
- if (numValue < min) {
|
|
|
- row[field] = min
|
|
|
- } else if (numValue > max) {
|
|
|
- row[field] = max
|
|
|
- } else {
|
|
|
- // 限制为2位小数
|
|
|
- const roundedValue = Math.round(numValue * 100) / 100
|
|
|
- row[field] = roundedValue
|
|
|
- }
|
|
|
- }
|
|
|
+ // 更新字段值,但不进行范围检查(留到blur时处理)
|
|
|
+ row[field] = cleanValue
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证并格式化浮点数(失焦时验证)
|
|
|
+ * @param {Object} row - 当前行数据
|
|
|
+ * @param {string} field - 字段名
|
|
|
+ * @param {number} min - 最小值
|
|
|
+ * @param {number} max - 最大值
|
|
|
+ * @param {number} precision - 小数位数,默认2位
|
|
|
+ */
|
|
|
+ validateAndFormatFloatOnBlur(row, field, min = 0, max = 999999.99, precision = 2) {
|
|
|
+ const value = row[field]
|
|
|
+
|
|
|
+ // 如果是空值或无效输入,设置为最小值
|
|
|
+ if (value === '' || value === '.' || value === '-' || value === '-.' || isNaN(parseFloat(value))) {
|
|
|
+ row[field] = min
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const numValue = parseFloat(value)
|
|
|
+
|
|
|
+ // 范围检查
|
|
|
+ if (numValue < min) {
|
|
|
+ row[field] = min
|
|
|
+ } else if (numValue > max) {
|
|
|
+ row[field] = max
|
|
|
+ } else {
|
|
|
+ // 格式化为指定小数位数
|
|
|
+ const multiplier = Math.pow(10, precision)
|
|
|
+ const roundedValue = Math.round(numValue * multiplier) / multiplier
|
|
|
+ row[field] = roundedValue
|
|
|
}
|
|
|
},
|
|
|
|