#数値列と文字列の変換方法
https://qiita.com/smicle/items/29a4d5d1d14ad7f77f60
https://qiita.com/yagince/items/e7474839246ced595f7a
を見ていて、たとえば文字列で与えられた数字列"1234"みたいなものに対して
1桁ずつ抜き出して処理する(奇数桁と偶数桁をそれぞれ抜き出してかける、13×24)みたいな処理をやるときは
どうすればいいんだろうと思ったので色々書いてみた
#大まかにはどうしていくか
文字列で"1234"を与えられたような場合を考える。
1文字ずつcharに直して数値(u32とか)に変換しそれをベクタにいれることで
1桁ずつ処理するソフトを書けそうな感じがする。
型変換の大まかな流れは
&str
⇒core::str::iter::Chars
⇒alloc::vec::Vec<u32>
⇒&alloc::vec::Vec<alloc::string::String>
戻すときはベクタの要素を全部くっつけてStringにすればサクッと戻せる
書いててalloc::vec::Vec<T>
とstd::vec::Vec<T>
の違いが判らなくなってきた
fn typenameの挙動がよくわかっていないため。
今回の型はすべてこいつから見ているので違うところあるかもしれません。
#ソースコード
fn typename<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
fn main() {
//a は&str の数字文字列になる
let a = "368745972";
let mut num = Vec::new();
//ここでnumは alloc::vec::Vec<u32>,ベクタの中が数字u32のものにになる
println!("type is {}", typename(a.chars()));
for i in a.chars(){
num.push(i.to_digit(10).unwrap());//u32 でpushしてる
}
//numが数字を格納したベクタになっているのでスライスでソートしたりできる。
&num.sort();
&num.reverse();
//ここで1数字ずつの処理を入れたりする
//例えば奇数桁だけ抜き出すとか。ここでは単純に追加しているだけにしている
// first は&alloc::vec::Vec<u32>のまま
let mut first = Vec::new();
for i in 0..num.len(){
first.push(num[i]);
}
//ここで操作した数字を文字に戻してベクタに格納する。ここはcollect()でfirst_charに代入でもいいかも
//first_char は alloc::vec::Vec<alloc::string::String>
let mut first_char = Vec::new();
for i in first.into_iter().map(|x| x.to_string()){
first_char.push(i)
}
//こっちでもいい
//let first_char :std::vec::Vec<std::string::String> = first.into_iter().map(|x| x.to_string()).collect();
//ベクタ内のStringになっている数字をすべてつなげて整数値に変換。今回はソートいれてるので数値が微妙に異なる
let x = i64::from_str_radix(&first_char.join(""),10).unwrap();
assert_eq!(x, 987765432);
//文字列に戻したければこう。
assert_eq!(x.to_string(), "987765432");
//コンマの位置とか変えたければ num=4.4 format!("{:.2}", num); // "4.40"
println!("type is {}", typename(x.to_string()));
//alloc::string::String
}