如何检查用户输入的变量是否为数字(int,float)?

时间:2016-11-22 15:59:57

标签: rust

如何检查变量(由用户输入)是一个数字,如int,float或其他什么?

我想用match表达式执行此操作:

let mut input = String::new();
io::stdin().read_line(&mut input);
let result = match input {
    // !!??     
}

是否可以match

1 个答案:

答案 0 :(得分:6)

如果你想要匹配某些东西,那么你需要一些东西去构建。您可以匹配字符串切片,但只能匹配有限集,因此这对此没有帮助。

所以让我们有一个匹配的枚举:

enum Value {
    Int(isize),
    Float(f64),
}
use Value::*;  // Make the variants available without Value::

然后,您需要将字符串解析为适当的类型。您可以对每种类型使用parse方法(如果您对Rust的语法感到满意;否则您可能需要更高级的解析器):

fn parse_string(s: &str) -> Option<Value> {
    if let Ok(i) = s.parse() {  // inferred as isize from next line
        Some(Int(i))
    } else if let Ok(f) = s.parse() {
        Some(Float(f))
    } else {
        None
    }
}

请注意,按此顺序尝试解析时,顺序很重要; "123"也会解析为f64

我正在将任何解析错误转换为None并使用Option而不是Result,因为不清楚错误是什么(因为每个解析都可以返回自己的错误);在实际应用程序中,我可能有ParseError类型。

现在我们可以匹配结果:

fn main() {
    let x = "123";
    match parse_string(x) {
        Some(Int(i)) => println!("int {}", i),
        Some(Float(f)) => println!("float {}", f),
        None => println!("Didn't parse"),
    }
    let x = "123.5";
    match parse_string(x) {
        Some(Int(i)) => println!("int {}", i),
        Some(Float(f)) => println!("float {}", f),
        None => println!("Didn't parse"),
    }
}

Runnable playground link