如何复用Rust针对字符串形式数字的数值类型推断规则?
实现Rust风格的数字类型推断逻辑
根据你提到的Rust数字字面量推断规则(无小数部分为整数、带小数部分为f64),可以通过以下代码实现字符串输入的类型判断:
定义类型枚举
首先扩展枚举以包含无效输入的情况,覆盖所有可能场景:
enum NumType { I32, F64, Invalid, }
实现类型推断函数
核心逻辑是先判断字符串是否包含小数或指数符号,再尝试解析为对应数值类型:
fn get_type(s: &str) -> NumType { let s_trimmed = s.trim(); // 处理空输入 if s_trimmed.is_empty() { return NumType::Invalid; } // 包含小数点或指数符号的字符串优先判断为f64 let has_float_indicator = s_trimmed.contains('.') || s_trimmed.to_lowercase().contains('e'); if has_float_indicator { return match s_trimmed.parse::<f64>() { Ok(_) => NumType::F64, Err(_) => NumType::Invalid, }; } // 无浮点数标识时尝试解析为i32 match s_trimmed.parse::<i32>() { Ok(_) => NumType::I32, Err(_) => NumType::Invalid, } }
测试案例
可以通过以下测试验证逻辑正确性:
fn main() { assert_eq!(get_type("123"), NumType::I32); assert_eq!(get_type("-789"), NumType::I32); assert_eq!(get_type("12.34"), NumType::F64); assert_eq!(get_type("5.6e7"), NumType::F64); assert_eq!(get_type("12a3"), NumType::Invalid); assert_eq!(get_type(" 987 "), NumType::I32); assert_eq!(get_type(""), NumType::Invalid); }
逻辑说明
- 先去除输入字符串的首尾空白,避免空格干扰判断
- 若字符串包含小数点(
.)或指数符号(e/E),则尝试解析为f64,成功则返回F64,否则标记为无效 - 无浮点数标识时,尝试解析为
i32,成功返回I32,否则标记为无效
内容的提问来源于stack exchange,提问作者A. K.
相关产品推荐
相关产品推荐

