如何将一串数字转换为数字向量?

时间:2017-04-20 10:03:47

标签: string char rust type-conversion

我正在尝试存储string(或str)个数字,例如12345放入向量中,以使向量包含{1,2,3,4,5}

由于我对Rust完全不熟悉,我遇到类型问题(Stringstrchar,...),但也缺少任何信息关于转换。

我目前的代码如下:

fn main() {
    let text = "731671";                
    let mut v: Vec<i32>;
    let mut d = text.chars();
    for i in 0..text.len() {
        v.push( d.next().to_digit(10) );
    }
}

3 个答案:

答案 0 :(得分:7)

你很亲密!

首先,索引循环for i in 0..text.len()不是必需的,因为无论如何你都要使用迭代器。直接在迭代器上循环更简单:for ch in text.chars()。不仅如此,你的索引循环和字符迭代器可能会分歧,因为len()返回字节数,chars()返回Unicode标量值。作为UTF-8,字符串的Unicode标量值可能少于字节数。

下一个障碍是to_digit(10)返回Option,告诉您角色可能不是数字。您可以使用to_digit(10)检查Some是否已返回Option的{​​{1}}变体。

拼凑在一起,代码现在看起来像这样:

if let Some(digit) = ch.to_digit(10)

现在,这是非常必要的:你正在制作一个矢量并逐个填充它,所有这些都是你自己。您可以通过对字符串应用转换来尝试更多declarative or functional方法:

fn main() {
    let text = "731671";
    let mut v = Vec::new();
    for ch in text.chars() {
        if let Some(digit) = ch.to_digit(10) {
            v.push(digit);
        }
    }
    println!("{:?}", v);
}

答案 1 :(得分:3)

ArtemGr的答案相当不错,但他们的版本会跳过任何不是数字的字符。如果你想让它在坏数字上失败,你可以使用这个版本:

fn to_digits(text: &str) -> Option<Vec<u32>> {
    text.chars().map(|ch| ch.to_digit(10)).collect()
}
fn main() {
    println!("{:?}", to_digits("731671"));
    println!("{:?}", to_digits("731six71"));
}

输出:

Some([7, 3, 1, 6, 7, 1])
None

答案 2 :(得分:0)

Rust的新版本

如果转换为数字失败,则返回一个枚举。

#[derive(Debug, PartialEq)]
pub enum Error {
    InvalidDigit(char),
}


fn to_digits(text: &str) ->  Result<Vec<u32>, Error> {

    let mut numbers = Vec::new();
    for s in string_digits.chars(){

        match s.to_digit(10){
            Some(number) => numbers.push(number),
            None => {return Err(Error::InvalidDigit(s));}
        }
    Ok(numbers)
    }