하기와 같은 Rust 문제가 있습니다.
Q) 임의의 숫자를 입력 받고(만약 문자열을 입력하면 에러메시지를 내고 다시 입력 받음) 그 숫자를
20 자리의 xxx,xxx,xxx 형태로 출력하세요.
만약 출력 문자열의 자릿수가 20 자리가 안되면 앞에 '0' 을 붙여주세요.
예를 들어 1234567 을 터미널에서 입력했으면 000000000001,234,567 와 같이 출력하세요.
A) 이 문제의 문제점은 print() 문의 format 을 적용하여야 하고
또 문제 하나는 숫자들 사이에 천단위 별로 콤마를 삽입해야 한다는 것입니다.
(추가 업데이트)
기존에는 입력받은 숫자 즉 String에서 콤마를 넣기 위해 Separator 라는 crate를 사용했습니다.
그리고 println!() 에서 format string을 적용하였습니다.
crate 이용한 방법은 하기 링크에서
그런데
이번에는 Separator 라는 crate를 사용하지 않고 아래와 같이 해결하였습니다.
(추가 업데이트)
우선, 아래 코드를 보시면
다음 링크와 같이, String의 요소 하나하나를 indexing 하는 방법을 알아야 합니다.
위 링크와 같이 String을 인텍싱하는 방법을 이용하여
그리고 마지막으로 println!()에서 format string을 아래 링크와 같이 이용하여
코드를 작성했습니다.
결국,
String idexing 과 format string을 이용해서
아래와 같은 완성된 코드를 적용하였습니다.
use std::{io, u64};
fn main() {
println!("Program start!");
loop {
println!("Please input your number of 20 or less digits.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let input_num: u64 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("Error: you have to input number of 20 or less digits!");
continue
},
};
//
//예를 들어 1234567 을 터미널에서 입력했으면 000000000001,234,567 와 같이 출력하세요.
//
let input_string_num = input_num.to_string();
let mut output_string_num = String::new();
let len = input_string_num.chars().count(); // note: String.len() means count in bytes.
let mut i = 0; // for from input
let mut k = 0; // for to output
while i < len {
//let b: u8 = input_string_num.as_bytes()[i];
//let c: char = b as char;
output_string_num.insert(k, input_string_num.as_bytes()[i] as char);
if len > 3 {
/*
k = k + 1;
if i == (len - 1) {
break;
}*/
if (i%3 == 2) && (len % 3 == 0){ //ex: 123456 => 123,456
k = k + 1;
if i == (len - 1) {
break;
}
output_string_num.insert(k, ',');
} else if (i%3 == 0) && (len % 3 == 1) { // ex: 1234567 => 1,234,567
k = k + 1;
if i == (len - 1) {
break;
}
output_string_num.insert(k, ',');
} else if (i%3 == 1) && (len % 3 == 2){ // ex: 12345678=> 12,345,678
k = k + 1;
if i == (len - 1) {
break;
}
output_string_num.insert(k, ',');
}
}
i = i + 1;
k = k + 1;
}
println!("The result is {:0>width$}", output_string_num, width = 20);
}
}
그럼,
정보 공유합니다.
'개발 이야기 > Rust 언어 이야기' 카테고리의 다른 글
리눅스 30주년 리누스 토발즈 인터뷰 중 Rust 언급 (0) | 2021.05.24 |
---|---|
rust 언어 기반의 웹프레임워크 의 현재 상태는? (0) | 2021.05.06 |
rust 에서 String 에서 요소 하나 하나를 index 인덱싱 하는 방법 (0) | 2021.05.04 |
Rust - string conversion 관련 예제 코드 (0) | 2021.05.03 |
rust 에서 print()의 format 관련 내용 (0) | 2021.04.30 |