T
作为分母和分母,并根据一些简单规则格式化小数。我看过num
特性,但是仍然无法使其有效。我已经有了比我想要的还要冗长的代码,因此我认为是时候寻求帮助了。
extern crate num;
use num::{Integer,FromPrimitive};
fn format_rational<T>(n: T, d: T) -> String
where T: Integer + FromPrimitive + fmt::Display
{
let one: T = FromPrimitive::from_u16(1).unwrap();
let ten: T = FromPrimitive::from_u16(10).unwrap();
let hun: T = FromPrimitive::from_u16(100).unwrap();
let tho: T = FromPrimitive::from_u16(1000).unwrap();
let precision = match d {
one => Some(1),
hun => Some(2),
tho => Some(3),
_ => None,
};
match precision {
Some(p) => format!("{:.*}", p, n as f32 / d as f32),
None => format!("{} / {}", n, d),
}
}
此错误与
non-primitive cast: `T` as `f32`
但是当我将第一条format!
行更改为]时>
Some(p) => format!("{:.*}", p, f32::from(n) / f32::from(d))
我收到此错误:
the trait bound `f32: std::convert::From<T>` is not satisfied
我将其解释为“对于f32类型,不存在From”,这是有道理的。当特征为f32
时,如何表示Num
,这意味着Eq
,这意味着它应排除浮点数? (因为浮动仅实现PartialEq
)。最后,有没有一种方法可以简单地使用From<T>
?我想念的是什么?还是可以通过另一种(更轻松的)方式解决问题?谢谢!
我正在尝试构建一个通用的格式化函数,该函数使用两个整数T作为分母和分母,并根据一些简单规则格式化小数。我看了一下num trait,...
extern crate num;
use std::fmt;
use num::{ToPrimitive};
pub fn format_rational<T>(n: T, d: T) -> String
where T: ToPrimitive + fmt::Display
{
let precision = match d.to_usize().unwrap() {
1 | 10 => Some(1),
100 => Some(2),
1000 => Some(3),
_ => None,
};
match precision {
Some(p) => format!("{:.*}", p, ToPrimitive::to_f32(&n).unwrap() / ToPrimitive::to_f32(&d).unwrap()),
None => format!("{} / {}", n, d),
}
}
unwrap
: