diff --git a/src/food-market.web/src/components/Field.tsx b/src/food-market.web/src/components/Field.tsx index d910c7e..aeb54f7 100644 --- a/src/food-market.web/src/components/Field.tsx +++ b/src/food-market.web/src/components/Field.tsx @@ -60,8 +60,14 @@ export function MoneyInput({ const settingKnown = allowFractional !== undefined || org.data !== undefined const fractional = allowFractional ?? org.data?.allowFractionalPrices ?? true - const formatFromValue = (v: number | null | undefined, frac: boolean) => - v == null ? '' : (frac ? String(v) : String(Math.round(v))) + const formatFromValue = (v: number | null | undefined, frac: boolean) => { + if (v == null) return '' + // При fractional=true всегда показываем ровно 2 знака после запятой + // (1317 → «1317.00», 1317.5 → «1317.50»). Так юзеру визуально понятно, + // что поле допускает копейки и текущее значение — это целое. + if (frac) return v.toFixed(2) + return String(Math.round(v)) + } // Локальный draft — то что юзер реально печатает. Может быть промежуточным // ("100.", "100.5", "0."). Sync с внешним value только когда поле не в фокусе.