diff --git a/clap_derive/src/item.rs b/clap_derive/src/item.rs index 4dc95c08705..6289e6d9870 100644 --- a/clap_derive/src/item.rs +++ b/clap_derive/src/item.rs @@ -584,12 +584,25 @@ impl Item { s }) } else { - quote_spanned!(attr.name.span()=> { - static DEFAULT_VALUE: ::std::sync::OnceLock = ::std::sync::OnceLock::new(); - let s = DEFAULT_VALUE.get_or_init(|| { + let default_string = if is_simple_ty(ty, "f32") || is_simple_ty(ty, "f64") { + quote_spanned!(attr.name.span()=> { + let val: #ty = #val; + let s = val.to_string(); + if s.contains('.') || s.contains('e') || s.contains('E') { + s + } else { + format!("{s}.0") + } + }) + } else { + quote_spanned!(attr.name.span()=> { let val: #ty = #val; ::std::string::ToString::to_string(&val) - }); + }) + }; + quote_spanned!(attr.name.span()=> { + static DEFAULT_VALUE: ::std::sync::OnceLock = ::std::sync::OnceLock::new(); + let s = DEFAULT_VALUE.get_or_init(|| #default_string); let s: &'static str = &*s; s }) diff --git a/tests/derive/default_value.rs b/tests/derive/default_value.rs index 8d867e33cca..d67933d7fc8 100644 --- a/tests/derive/default_value.rs +++ b/tests/derive/default_value.rs @@ -57,6 +57,32 @@ Options: "#]].raw()); } +#[test] +fn default_value_t_float() { + #[derive(Parser, PartialEq, Debug)] + struct Opt { + #[arg(short = 'a', default_value_t = 1.0)] + amplify: f32, + } + assert_eq!( + Opt { amplify: 1.0 }, + Opt::try_parse_from(["test"]).unwrap() + ); + + let help = utils::get_long_help::(); + assert_data_eq!(help, str![[r#" +Usage: clap [OPTIONS] + +Options: + -a + [default: 1.0] + + -h, --help + Print help + +"#]].raw()); +} + #[test] fn auto_default_value_t() { #[derive(Parser, PartialEq, Debug)]