From 80089b594eb2cbc5804b9ab06d58c3718806523f Mon Sep 17 00:00:00 2001 From: Nikita Skvortsov Date: Tue, 25 Nov 2025 15:44:43 +0300 Subject: [PATCH] fix: fix numbers with leading zeroes after decimal point --- .../core/components/Form/Controller/utils.tsx | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/lib/core/components/Form/Controller/utils.tsx b/src/lib/core/components/Form/Controller/utils.tsx index 94f8c708..cdb844ec 100644 --- a/src/lib/core/components/Form/Controller/utils.tsx +++ b/src/lib/core/components/Form/Controller/utils.tsx @@ -42,6 +42,14 @@ import type { UpdateStoreParams, } from './types'; +/* + * Stores original string representation of numbers + * used for correct intermediate representations of number + * to display in cases when they are otherwise changed by conversion + * e.g., 0.0 -> 0 + */ +const originalNumberStringMap = new Map(); + const isErrorMutatorCorrect = (errorMutator: {value: ValidateError} | typeof EMPTY_MUTATOR) => errorMutator !== EMPTY_MUTATOR && (isString(errorMutator.value) || @@ -144,6 +152,15 @@ export const getRender = ( Layout, }: GetRenderParams) => { const render = (props: FieldRenderProps) => { + if (originalNumberStringMap.has(name)) { + const originalString = originalNumberStringMap.get(name); + if (Number(originalString) === Number(props.input.value)) { + props.input.value = originalString as DirtyValue; + } else { + originalNumberStringMap.delete(name); + } + } + if (inputEntity && isCorrectSpec(spec) && isString(name)) { if (!spec.viewSpec.hidden) { const {layoutProps, inputProps} = spec.viewSpec; @@ -297,6 +314,12 @@ export const getFieldMethods = < const error = validate?.(transformArrOut(_value)) || errorMutator; let value = transformArrIn(_value); + if (typeof value === 'string' && /^[0-9]+.[0-9]*0+$/.test(value)) { + originalNumberStringMap.set(store.name, value); + } else { + originalNumberStringMap.delete(store.name); + } + if (isNumberSpec(spec) && !error) { value = (isNil(value) || value === '' ? undefined : Number(value)) as DirtyValue; } @@ -383,6 +406,8 @@ export const getFieldMethods = < ) => { const {name, spec} = store; + originalNumberStringMap.delete(store.name); + if (isArraySpec(spec) || isObjectSpec(spec)) { return onChange(store, { valOrSetter: (currentValue) =>