当前位置: 首页 > 知识库问答 >
问题:

如何将Rust char转换为整数,使1变为1?

单于浩邈
2023-03-14

我试图找到一个给定数字的数字之和。例如,134将给出8

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

我尝试使用下面的代码将char转换为整数:

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

(游乐场)

但它会导致以下错误:

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

这段代码正是我想做的,但是首先我必须将每个char转换成一个字符串,然后转换成一个整数,然后通过z增加

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);
}

(游乐场)

共有3个答案

费朗
2023-03-14

另一种方法是迭代字符串的字符,并使用折叠转换和添加它们。

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));
}
赵正雅
2023-03-14
my_char as u32 - '0' as u32

现在,关于这个答案还有很多要解释的。

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

但是,对于这个范围之外的值,它应该做什么呢?如果您提供'p'会发生什么?它返回64。那么'.'呢?这会引起恐慌。并且'♥'将返回9781。

字符串不仅仅是一袋袋字节。它们是UTF-8编码的,你不能忽视这个事实。每个char可以包含任何Unicode标量值。

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

从效率的角度来看,分配字符串似乎效率低下。Rosetta代码有一个使用迭代器的示例,迭代器只执行数值运算:

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>());
}
商和雅
2023-03-14

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

您还可以使用迭代器::sum方便地计算序列的和:

fn main() {
    const RADIX: u32 = 10;
    let x = "134";
    println!("{}", x.chars().map(|c| c.to_digit(RADIX).unwrap()).sum::<u32>());
}
 类似资料:
  • 我有一个表,它有一个主键列“gid”,它的类型是“Integer NOT NULL”。我想把它转换成“Serial NOT NULL”,这样我就可以在这个表中插入一些值。我使用以下命令将其转换为串行: 此命令将整数转换为串行。但是,当我在表中输入一些数据时,出现了以下错误: 错误:重复的键值违反唯一约束“pk_测试”。 请帮我解决这个问题。是否有其他方法将整数转换为串行?

  • 问题内容: 我需要使用反射获取字段的值。碰巧我并不总是确定该字段的数据类型是什么。为此,为了避免某些代码重复,我创建了以下方法: 并使用如下方法: 要么 问题是我似乎无法转换为: 有没有更好的方法来实现这一目标? 我正在使用Java 1.6。 问题答案: 不,即使可以从转换为,也无法转换为。对于已知为数字的 单个 值,并且想要获得长整型值,可以使用: 对于数组,这将比较棘手…

  • 问题内容: 我有Hibernate方法,它返回给我一个BigDecimal。我有另一个API方法,我需要将该数字传递给它,但是它接受Integer作为参数。我不能更改两种方法的返回类型或变量类型。 现在如何将BigDecimal转换为Integer并将其传递给第二种方法? 有没有解决的办法? 问题答案: 您将致电(或仅致电),如果您丢失了信息,它甚至会引发异常。返回一个int,但是自动装箱可以解决

  • 是否可以将字符串(如12)转换为等于3的整数? 我知道我可以用value()得到单个数字的值 但是,有没有可能在一个步骤而不是两个步骤中将“12”转换为3?

  • 如果我有一个带有两个值的变量(例如Sex可以取男性或女性),我会使用如下代码:, 将字符串转换为整数。如果变量包含两个以上的值,如分类为低/中/高的工资,该怎么做?如何分配与上述类似的值?

  • 问题内容: 我想创建一种计算整数和大十进制乘法的方法。我在Google和论坛上搜索没有找到任何内容。 有人能帮我吗? 问题答案: 要将整数(或字节/短/浮点数/双精度数)与BigInteger(或BigDecimal)相乘,必须先将本机数字转换为BigInteger / BigDecimal。 注意:是不一样的,而且在不同的原因的BigDecimal和BigInteger的。在这两种情况下,我建议