You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复用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);
}

逻辑说明

  1. 先去除输入字符串的首尾空白,避免空格干扰判断
  2. 若字符串包含小数点(.)或指数符号(e/E),则尝试解析为f64,成功则返回F64,否则标记为无效
  3. 无浮点数标识时,尝试解析为i32,成功返回I32,否则标记为无效

内容的提问来源于stack exchange,提问作者A. K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 02:02:31