use std::num::{ParseIntError, TryFromIntError};
fn convert_base<T: std::fmt::Display>(num_str: &str, from_base: u32, to_base: u32) -> Result<(), ConversionError> {
if from_base < 2 || from_base > 36 || to_base < 2 || to_base > 36 {
return Err(ConversionError::InvalidBase);
}
let num: i128 = match num_str.parse::<i128>() {
Ok(n) => n,
Err(e) => {
return Err(ConversionError::ParseError(e));
}
};
if num < i128::MIN || num > i128::MAX {
return Err(ConversionError::OutOfRange);
}
let converted_num = match T::try_from(num) {
Ok(n) => n,
Err(e) => {
return Err(ConversionError::TryFromError(e));
}
};
let result = if num >= 0 {
format!("{:b}", converted_num).replace("0b", "")
} else {
format!("-{:b}", -converted_num).replace("0b", "")
};
println!("Converted number: {}", result);
Ok(())
}
enum ConversionError {
InvalidBase,
ParseError(ParseIntError),
OutOfRange,
TryFromError(TryFromIntError),
}
fn main() {
let num_str = "10";
let from_base = 10;
let to_base = 2;
match convert_base::<i32>(num_str, from_base, to_base) {
Ok(_) => (),
Err(e) => match e {
ConversionError::InvalidBase => println!("Invalid base"),
ConversionError::ParseError(e) => println!("Parse error: {}", e),
ConversionError::OutOfRange => println!("Number out of range"),
ConversionError::TryFromError(e) => println!("TryFrom error: {}", e),
},
}
}
- 函数定义与参数:
convert_base
函数使用泛型 T
,它接受三个参数:num_str
是需要转换的数字字符串,from_base
是源进制,to_base
是目标进制。
- 错误处理:
- 检查源进制和目标进制是否在合法范围(2到36),如果不在,返回
ConversionError::InvalidBase
。
- 使用
parse::<i128>
尝试将字符串解析为 i128
,如果失败,返回 ConversionError::ParseError
。
- 检查解析后的数字是否在
i128
的范围内,否则返回 ConversionError::OutOfRange
。
- 使用
T::try_from
尝试将 i128
转换为泛型类型 T
,如果失败,返回 ConversionError::TryFromError
。
- 进制转换: 这里简单将数字转换为二进制字符串作为示例,实际转换到任意进制需要更复杂的算法。
- 主函数: 主函数调用
convert_base
并处理可能返回的错误。