@@ -42,6 +42,14 @@ import type {
4242 UpdateStoreParams ,
4343} from './types' ;
4444
45+ /*
46+ * Stores original string representation of numbers
47+ * used for correct intermediate representations of number
48+ * to display in cases when they are otherwise changed by conversion
49+ * e.g., 0.0 -> 0
50+ */
51+ const originalNumberStringMap = new Map < string , string > ( ) ;
52+
4553const isErrorMutatorCorrect = ( errorMutator : { value : ValidateError } | typeof EMPTY_MUTATOR ) =>
4654 errorMutator !== EMPTY_MUTATOR &&
4755 ( isString ( errorMutator . value ) ||
@@ -144,6 +152,15 @@ export const getRender = <DirtyValue extends FieldValue, SpecType extends Spec>(
144152 Layout,
145153} : GetRenderParams < DirtyValue , SpecType > ) => {
146154 const render = ( props : FieldRenderProps < DirtyValue > ) => {
155+ if ( originalNumberStringMap . has ( name ) ) {
156+ const originalString = originalNumberStringMap . get ( name ) ;
157+ if ( Number ( originalString ) === Number ( props . input . value ) ) {
158+ props . input . value = originalString as DirtyValue ;
159+ } else {
160+ originalNumberStringMap . delete ( name ) ;
161+ }
162+ }
163+
147164 if ( inputEntity && isCorrectSpec ( spec ) && isString ( name ) ) {
148165 if ( ! spec . viewSpec . hidden ) {
149166 const { layoutProps, inputProps} = spec . viewSpec ;
@@ -297,6 +314,12 @@ export const getFieldMethods = <
297314 const error = validate ?.( transformArrOut ( _value ) ) || errorMutator ;
298315 let value = transformArrIn ( _value ) ;
299316
317+ if ( typeof value === 'string' && / ^ [ 0 - 9 ] + .[ 0 - 9 ] * 0 + $ / . test ( value ) ) {
318+ originalNumberStringMap . set ( store . name , value ) ;
319+ } else {
320+ originalNumberStringMap . delete ( store . name ) ;
321+ }
322+
300323 if ( isNumberSpec ( spec ) && ! error ) {
301324 value = ( isNil ( value ) || value === '' ? undefined : Number ( value ) ) as DirtyValue ;
302325 }
@@ -383,6 +406,8 @@ export const getFieldMethods = <
383406 ) => {
384407 const { name, spec} = store ;
385408
409+ originalNumberStringMap . delete ( store . name ) ;
410+
386411 if ( isArraySpec ( spec ) || isObjectSpec ( spec ) ) {
387412 return onChange ( store , {
388413 valOrSetter : ( currentValue ) =>
0 commit comments