You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue项目中Maska格式化小数格式异常,寻求解决方向

问题分析与解决方向

你的核心问题是Maska未正确应用de-DE locale的数字格式化规则,导致带小数的数值被错误解析。结合你的代码和测试用例,以下是具体修正方案:

1. 修正Maska配置结构

你当前的配置缺少mask: 'number'字段,这是Maska识别数字格式化模式的关键——没有它,指令无法正确读取number配置项的规则,进而错误地将小数部分当成整数位处理。

修正后的配置:

<script setup lang="ts">
import { vMaska } from "maska/vue";

const emit = defineEmits(['update:modelValue']);

const props = defineProps({
  amount: {
    type: Number
  },
})

// 添加mask字段指定格式化类型
const options = {
  mask: 'number',
  number:{
    fraction: 2,
    locale: 'de-DE'
  },
};
</script>

2. 修复测试用例的参数错误

第二个测试用例中,你传递的props参数名是betrag,但组件定义的props是amount,导致组件未接收到正确的测试数值,测试必然失败。

修正后的测试代码:

it('with fraction', () => {
  cy.mount(AmountField, {
    propsData: {
      amount: 26717.01, // 替换betrag为amount
      editable: true,
      disabled: true,
      id: "amountField"
    }
  } as any);
  cy.get("#amountField").find('input').should('have.value', '26.717,01')
})

3. 修正数值转换逻辑

@maska事件中,直接将带逗号(de-DE小数分隔符)的unmasked字符串转为Number会得到NaN,需要先将逗号替换为小数点再转换。

修正后的事件处理:

<template>
  <v-text-field
    variant="outlined"
    :clearable=false
    density="compact"
    auto-grow
    rows="1"
    :model-value="props.amount"
    v-maska="options"
    v-bind="$attrs"
    @maska="(event) => {
      const unmasked = event.detail.unmasked;
      // 替换德语小数分隔符为标准小数点后转数字
      const numericValue = Number(unmasked.replace(',', '.'));
      emit('update:modelValue', numericValue);
    }"
  />
</template>

完成以上修正后,带小数的数值应该会正确格式化为26.717,01,同时测试用例也能正常通过。

内容的提问来源于stack exchange,提问作者Jens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:14:55