diff --git a/apps/admin-web/src/pages/adminEditorGenerationPricing.test.ts b/apps/admin-web/src/pages/adminEditorGenerationPricing.test.ts index b4fc133a6..f0b62b7e2 100644 --- a/apps/admin-web/src/pages/adminEditorGenerationPricing.test.ts +++ b/apps/admin-web/src/pages/adminEditorGenerationPricing.test.ts @@ -28,10 +28,12 @@ function pricingFixture(): EditorGenerationPricingConfigPayload { }; } -test('数值解析把空串、非数字与 0 收敛成 0', () => { +test('数值解析把空串、非数字、小数与 0 收敛成 0', () => { expect(parsePositiveInteger('12')).toBe(12); expect(parsePositiveInteger('')).toBe(0); expect(parsePositiveInteger('abc')).toBe(0); + expect(parsePositiveInteger('12abc')).toBe(0); + expect(parsePositiveInteger('3.9')).toBe(0); expect(parsePositiveInteger('0')).toBe(0); expect(parsePositiveInteger('-3')).toBe(0); }); diff --git a/apps/admin-web/src/pages/adminEditorGenerationPricing.ts b/apps/admin-web/src/pages/adminEditorGenerationPricing.ts index 677a62325..69f0b0054 100644 --- a/apps/admin-web/src/pages/adminEditorGenerationPricing.ts +++ b/apps/admin-web/src/pages/adminEditorGenerationPricing.ts @@ -31,10 +31,12 @@ export function editorModel3dAddOnLabel(addOn: string) { return EDITOR_MODEL3D_ADD_ON_LABELS[addOn] ?? addOn; } -/** 输入框文本转整数;空串、非数字、0 与负数一律收敛成 0,交给提交前校验拦住。 */ +/** 输入框文本转整数;空串、非数字、小数、0 与负数一律收敛成 0,交给提交前校验拦住。 */ export function parsePositiveInteger(value: string) { - const parsed = Number.parseInt(value, 10); - return Number.isFinite(parsed) && parsed > 0 ? parsed : 0; + // 用 Number 而不是 parseInt:parseInt 会把 `3.9` 截成 3、`12abc` 截成 12, + // 等于把编辑中的半截输入静默当成合法值存下去。 + const parsed = Number(value); + return Number.isInteger(parsed) && parsed > 0 ? parsed : 0; } export function isPositiveMudPoints(value: number | null | undefined) {