目前,我使用下面的代码返回二进制(基数为2)、八进制(基数为8)或十六进制(基数为16)字符串形式的数字。
fn convert(inp: u32, out: u32, numb: &String) -> Result<String, String> {
match isize::from_str_radix(numb, inp) {
Ok(a) => match out {
2 => Ok(format!("{:b}", a)),
8 => Ok(format!("{:o}", a)),
16 => Ok(format!("{:x}", a)),
10 => Ok(format!("{}", a)),
0 | 1 => Err(format!("No base lower than 2!")),
_ => Err(format!("printing in this base is not supported")),
},
Err(e) => Err(format!(
"Could not convert {} to a number in base {}.\n{:?}\n",
numb, inp, e
)),
}
}
现在我想替换内部的match
语句,这样我就可以将数字作为任意基数的字符串(例如,base 3)返回。是否有内置函数可以将数字转换为任意给定的基数,类似于JavaScript的Number.toString()
method?
4条答案
按热度按时间bt1cpqcv1#
目前,您无法使用标准库执行此操作,但可以:
radix_fmt
oyt4ldly2#
如果你想增加一点性能,你可以创建一个struct并为它实现
Display
或Debug
。这样就避免了分配String
。为了最大限度的过度设计,你也可以用一个堆栈分配的数组来代替Vec
。以下是应用了这些更改的Boiethios' answer:
这仍然可以通过以下方式优化:
char
数组由于这些方法需要
unsafe
或arraybuf这样的外部机箱,所以我没有将它们包括在内,您可以在标准库的内部实现细节中看到示例代码。g6baxovj3#
第一个注解的扩展解决方案,未将参数
x
绑定为u32
。mzillmmw4#
这比另一个答案要快:
注意我也试过这些,但是它们比较慢: