Rust中将八进制字符串转换为u32时出现InvalidDigit错误如何解决
问题原因
u32::from_str_radix 不支持识别0o前缀,无论你传入的进制参数是多少,该函数都会逐字符检查输入字符串的每一位是否为对应进制下的合法字符,0o里的o不属于八进制合法字符范围,所以直接抛出InvalidDigit错误。
你提到的Octal trait是用于将数值格式化为带0o前缀的八进制字符串的输出工具,和字符串转数值的解析逻辑是完全反向的操作,二者规则不通用。
修复方案
你当前的umask函数返回的本身就是不带前缀的八进制数字字符串,直接传入解析即可,不需要额外拼接0o前缀:
use std::env; pub fn umask() -> String { match env::var("UMASK") { Ok(res) => res.into(), _ => "777".into() } } fn main() { println!("{:#?}", u32::from_str_radix(&umask(), 8)); }
如果你的场景需要兼容带0o前缀的输入,可以先手动去除前缀再解析:
fn parse_octal(s: &str) -> Result<u32, std::num::ParseIntError> { let s = s.strip_prefix("0o").unwrap_or(s); u32::from_str_radix(s, 8) }
内容的提问来源于stack exchange,提问作者Thermatix
相关产品推荐
相关产品推荐

