Skip to content

Commit d171a39

Browse files
committed
fix: keep intermediate number value representations
fixes #9959
1 parent 14dbc1b commit d171a39

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

.changeset/fast-weeks-clean.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: keep intermediate number value representations

packages/svelte/src/internal/client/render.js

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -926,32 +926,50 @@ export function selected(dom) {
926926
}
927927

928928
/**
929-
* @param {Element} dom
929+
* @param {HTMLInputElement} dom
930930
* @param {() => unknown} get_value
931931
* @param {(value: unknown) => void} update
932932
* @returns {void}
933933
*/
934934
export function bind_value(dom, get_value, update) {
935935
dom.addEventListener('input', () => {
936-
// @ts-ignore
936+
/** @type {any} */
937937
let value = dom.value;
938-
// @ts-ignore
939-
const type = dom.type;
940-
if (type === 'number' || type === 'range') {
941-
value = value === '' ? null : +value;
938+
if (is_numberlike_input(dom)) {
939+
value = to_number(value);
942940
}
943941
update(value);
944942
});
943+
945944
render_effect(() => {
946945
const value = get_value();
947-
const coerced_value = value == null ? null : value + '';
948-
// @ts-ignore
949-
dom.value = coerced_value;
950946
// @ts-ignore
951947
dom.__value = value;
948+
949+
if (is_numberlike_input(dom) && value === to_number(dom.value)) {
950+
// handles 0 vs 00 case (see https://github.com/sveltejs/svelte/issues/9959)
951+
return;
952+
}
953+
954+
dom.value = stringify(value);
952955
});
953956
}
954957

958+
/**
959+
* @param {HTMLInputElement} dom
960+
*/
961+
function is_numberlike_input(dom) {
962+
const type = dom.type;
963+
return type === 'number' || type === 'range';
964+
}
965+
966+
/**
967+
* @param {string} value
968+
*/
969+
function to_number(value) {
970+
return value === '' ? null : +value;
971+
}
972+
955973
/**
956974
* @param {HTMLSelectElement} dom
957975
* @param {() => unknown} get_value

0 commit comments

Comments
 (0)