如何将char转换为整数以使'1'变为1?

时间:2017-05-15 15:31:59

标签: rust

我正在尝试查找给定数字的所有数字的总和,例如134给出8

我的计划是使用string将数字转换为.to_string(),然后使用.chars()迭代数字来迭代数字。然后我想将迭代中的每个char转换为integer并添加到变量中。我想得到这个变量的最终值。

我尝试使用以下代码将char转换为integerPlayground):

fn main() {
    let x = "123";
    for y in x.chars() {
        let z = y.parse::<i32>().unwrap();
        println!("{}", z + 1);
    }
}

但它导致了这个错误:

error: no method named `parse` found for type `char` in the current scope
 --> <anon>:4:19
  |
4 |         let z = y.parse::<i32>().unwrap();
  |                   ^^^^^

如何将char转换为整数?

以下代码完全符合我的要求(Playground):

fn main() {
     let mut sum = 0;
     let x = 123;
     let x = x.to_string();
     for y in x.chars() {
        // converting `y` to string and then to integer
        let z = (y.to_string()).parse::<i32>().unwrap();
        // incrementing `sum` by `z`
        sum += z;
    }
    println!("{}", sum);
}

但首先我必须将char转换为字符串,然后转换为整数,以sum增加z。有没有办法直接将char转换为整数?

6 个答案:

答案 0 :(得分:12)

您需要的方法是char::to_digit。它将char转换为它在给定基数中表示的数字。

您还可以使用Iterator::sum方便地计算序列的总和:

fn main() {
    const RADIX: u32 = 10;
    let x = "134";
    println!("{}", x.chars().map(|c| c.to_digit(RADIX).unwrap()).sum::<u32>());
}

答案 1 :(得分:1)

my_char as u32 - '0' as u32

现在,解开这个答案还有很多东西。

它的工作原理是因为ASCII(以及UTF-8)编码的阿拉伯数字0-9按升序排列。您可以获取标量值并减去它们。

但是,它应该对 这个范围内的值做些什么呢?如果您提供'p'会怎样?它返回64. '.'怎么样?这将是恐慌。 '♥'将返回9781.

字符串不只是字节包。它们是UTF-8编码的,您不能忽视这一事实。每个char都可以保存任何Unicode标量值。

这就是为什么字符串是问题的错误抽象。

从效率的角度来看,分配字符串似乎效率低下。 Rosetta Code has an example of using an iterator只执行数字操作:

struct DigitIter(usize, usize);

impl Iterator for DigitIter {
    type Item = usize;
    fn next(&mut self) -> Option<Self::Item> {
        if self.0 == 0 {
            None
        } else {
            let ret = self.0 % self.1;
            self.0 /= self.1;
            Some(ret)
        }
    }
}

fn main() {
    println!("{}", DigitIter(1234, 10).sum::<usize>());
}

答案 2 :(得分:0)

另一种方法是迭代字符串中的字符并使用fold进行转换和添加。

fn sum_of_string(s: &str) -> u32 {
  s.chars().fold(0, |acc, c| c.to_digit(10).unwrap_or(0) + acc)
}

fn main() {
    let x = "123";
    println!("{}", sum_of_string(x));
}

答案 3 :(得分:0)

如果 c 是您的角色,您可以只写:

c as i32 - 0x30;

测试:

let c:char = '2';
let n:i32 = c as i32 - 0x30;
println!("{}", n);

输出:

2

注意:0x30 在 ASCII 表中是“0”,很容易记住!

答案 4 :(得分:-1)

方法parse()str上定义,而不在char上定义。 char是Unicode码点,宽度为32位。如果将其强制转换为整数,则优先使用u32而不是i32

您可以通过asinto()

进行投射
let a = '♥' as u32;
let b: u32 = '♥'.into();

答案 5 :(得分:-1)

为什么不只是

fn main() {
    let x = "123";
    let z = x.parse::<i32>().unwrap();
    println!("{}", z + 1);
}

Playground