我正在尝试查找给定数字的所有数字的总和,例如134
给出8
。
我的计划是使用string
将数字转换为.to_string()
,然后使用.chars()
迭代数字来迭代数字。然后我想将迭代中的每个char
转换为integer
并添加到变量中。我想得到这个变量的最终值。
我尝试使用以下代码将char
转换为integer
(Playground):
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
转换为整数?
答案 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
。
您可以通过as
或into()
:
let a = '♥' as u32;
let b: u32 = '♥'.into();
答案 5 :(得分:-1)
为什么不只是
fn main() {
let x = "123";
let z = x.parse::<i32>().unwrap();
println!("{}", z + 1);
}