fix(money-input): toFixed(2) при allowFractional=true для правильного отображения
Some checks failed
CI / POS (WPF, Windows) (push) Waiting to run
CI / Backend (.NET 8) (push) Successful in 57s
CI / Web (React + Vite) (push) Successful in 37s
Docker Images / Detect changes (push) Successful in 4s
Docker Images / API image (push) Has been skipped
Docker Images / Web image (push) Failing after 23s
Docker Images / Deploy stage (push) Has been skipped

formatFromValue использовал String(v) для дробного режима, поэтому
целые значения в БД (1317, 1860) показывались как «1317» / «1860»
даже при включённой галке «Разрешить дробные цены». Теперь:
- fractional=true → v.toFixed(2): 1317 → «1317.00», 1317.5 → «1317.50»;
- fractional=false → String(Math.round(v)): 1317.5 → «1318».

Хелпер используется в init useState, useEffect-синке и commitDraft —
таким образом при onBlur поле всегда возвращается к корректному
формату «1317.00».

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
nns 2026-04-25 12:55:33 +05:00
parent 4bfcc56e7d
commit 0218c799c5

View file

@ -60,8 +60,14 @@ export function MoneyInput({
const settingKnown = allowFractional !== undefined || org.data !== undefined const settingKnown = allowFractional !== undefined || org.data !== undefined
const fractional = allowFractional ?? org.data?.allowFractionalPrices ?? true const fractional = allowFractional ?? org.data?.allowFractionalPrices ?? true
const formatFromValue = (v: number | null | undefined, frac: boolean) => const formatFromValue = (v: number | null | undefined, frac: boolean) => {
v == null ? '' : (frac ? String(v) : String(Math.round(v))) 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 — то что юзер реально печатает. Может быть промежуточным // Локальный draft — то что юзер реально печатает. Может быть промежуточным
// ("100.", "100.5", "0."). Sync с внешним value только когда поле не в фокусе. // ("100.", "100.5", "0."). Sync с внешним value только когда поле не в фокусе.