Skip to content

Commit e55f9b0

Browse files
committed
InputNumber's formatter and parser using its generic type
1 parent f8d6aed commit e55f9b0

File tree

2 files changed

+13
-5
lines changed
  • demo_markdown/docs/input_number
  • thaw/src/input_number

2 files changed

+13
-5
lines changed

demo_markdown/docs/input_number/mod.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ view! {
4848
let value = create_rw_signal(0.0);
4949
let value_2 = create_rw_signal(0.0);
5050

51-
let formatter = Callback::<String, String>::new(move |v: String| {
51+
let formatter = Callback::<f64, String>::new(move |v: f64| {
52+
let v = v.to_string();
5253
let dot_pos = v.chars().position(|c| c == '.').unwrap_or_else(|| v.chars().count());
5354
let mut int: String = v.chars().take(dot_pos).collect();
5455

@@ -72,11 +73,11 @@ let formatter = Callback::<String, String>::new(move |v: String| {
7273
format!("{}{},{:0<2}", sign, int, dec)
7374
});
7475

75-
let parser = Callback::<String, String>::new(move |v: String| {
76+
let parser = Callback::<String, f64>::new(move |v: String| {
7677
let comma_pos = v.chars().position(|c| c == ',').unwrap_or_else(|| v.chars().count());
7778
let int_part = v.chars().take(comma_pos).filter(|a| a.is_digit(10)).collect::<String>();
7879
let dec_part = v.chars().skip(comma_pos + 1).take(2).filter(|a| a.is_digit(10)).collect::<String>();
79-
format!("{:0<1}.{:0<2}", int_part, dec_part)
80+
format!("{:0<1}.{:0<2}", int_part, dec_part).parse::<f64>().unwrap_or_default()
8081
});
8182

8283
view! {

thaw/src/input_number/mod.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ pub fn InputNumber<T>(
1414
#[prop(optional, into)] invalid: MaybeSignal<bool>,
1515
#[prop(optional, into)] class: OptionalProp<MaybeSignal<String>>,
1616
#[prop(optional)] comp_ref: ComponentRef<InputNumberRef>,
17-
#[prop(optional, into)] parser: OptionalProp<Callback<String, String>>,
18-
#[prop(optional, into)] formatter: OptionalProp<Callback<String, String>>,
17+
#[prop(optional, into)] parser: OptionalProp<Callback<String, T>>,
18+
#[prop(optional, into)] formatter: OptionalProp<Callback<T, String>>,
1919
#[prop(attrs)] attrs: Vec<(&'static str, Attribute)>,
2020
#[prop(default = MaybeSignal::Static(T::min_value()), into)] min: MaybeSignal<T>,
2121
#[prop(default = MaybeSignal::Static(T::max_value()), into)] max: MaybeSignal<T>,
@@ -79,6 +79,13 @@ where
7979
invalid.get() || value < min.get() || value > max.get()
8080
});
8181

82+
let parser = parser.map(|parser| {
83+
Callback::new(move |v| parser.call(v).to_string())
84+
});
85+
let formatter = formatter.map(|formatter| {
86+
Callback::new(move |v: String| formatter.call(v.parse::<T>().unwrap_or_default()))
87+
});
88+
8289
view! {
8390
<Input
8491
attrs

0 commit comments

Comments
 (0)