如何将Rust字符转换为整数,以便';1';变成1?

如何将Rust字符转换为整数,以便';1';变成1?,rust,Rust,我试图找到一个给定数字的数字之和。例如,134将给出8 我的计划是使用.to_string()将数字转换为字符串,然后使用.chars()将数字作为字符进行迭代。然后我想将迭代中的每个char转换为一个整数,并将其添加到一个变量中。我想得到这个变量的最终值 我尝试使用下面的代码将char转换为整数: fn main() { let x = "123"; for y in x.chars() { let z = y.parse::<i32>().unwr

我试图找到一个给定数字的数字之和。例如,
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);
    }
}
()

该方法是在
str
上定义的,而不是在
char
上定义的。字符是一个32位宽的Unicode码点。如果将其强制转换为整数,则使用
u32
优于
i32

您可以通过
将其转换为
或:

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

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

但是,对于超出此范围的值,它应该做什么?如果提供
'p'
,会发生什么情况?它返回64。那
”呢。
?这会引起恐慌。和
'♥'将返回9781

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

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

从效率的角度来看,分配字符串似乎效率低下。它只执行数字操作:

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>());
}
struct-digitter(usize,usize);
用于数字化仪的impl迭代器{
类型项=usize;
fn下一步(&mut self)->选项{
如果self.0==0{
没有一个
}否则{
设ret=self.0%self.1;
self.0/=self.1;
一些(ret)
}
}
}
fn main(){
println!(“{}”,数字机(1234,10)。总和::());
}
您需要的方法是。它将
char
转换为以给定基数表示的数字

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

fn main() {
    const RADIX: u32 = 10;
    let x = "134";
    println!("{}", x.chars().map(|c| c.to_digit(RADIX).unwrap()).sum::<u32>());
}
fn main(){
常数基数:u32=10;
设x=“134”;
println!(“{}”,x.chars().map(| c | c.to_位(基数).unwrap()).sum::());
}

另一种方法是迭代字符串中的字符,并使用
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));
}
为什么不

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

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

c作为i32-0x30;
使用以下各项进行测试:

让c:char='2';
设n:i32=c为i32-0x30;
普林顿!(“{}”,n);
输出:

2

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

它给了我
二进制运算+当我尝试向它添加一些东西时,不能应用于char类型如果你想解析整个整数,你所需要的就是
让v:i32=x.parse()。您能检查一下这是否是的副本吗?对不起,这可能让人困惑。它是一个整数值,但它是一个单独的类型,因为它不是一个你应该做算术运算的类型。我的问题是:你希望从你的程序中得到什么样的输出?@Ritiek:没问题;当我问一个问题时,我也有同样的问题,这个问题的上下文对我来说似乎很明显,因为我已经做了一段时间:)@shepmaster:
+1
难道不像代码会打印
2,3,4
(如果它会编译)那样令人困惑吗如果您不关心转换失败,可以使用。
flat_map
。@AurevoirXavier不,我不是这个意思。@Shepmaster您的意思是像
x.chars().flat_map(| x | c.到|数字(基数))
?这是因为展平结果会导致恐慌或给出值吗?@aravk33在这里非常合适,因为它将uwrap
选项
x.chars().filter_map(| c | c.to_digital(RADIX))
。我会更新答案。@murlakatamenka不,我是说
平面地图
。请不要看我的否决票,问题是如何将字符转换为整数(而不是字符串转换为整数)。
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));
}
fn main() {
    let x = "123";
    let z = x.parse::<i32>().unwrap();
    println!("{}", z + 1);
}
2