본문 바로가기

개발 이야기/Rust 언어 이야기

rust 에서 String 에서 요소 하나하나를 index 인덱싱 & print() format

728x90

하기와 같은 Rust 문제가 있습니다.

 

Q) 임의의 숫자를 입력 받고(만약 문자열을 입력하면 에러메시지를 내고 다시 입력 받음) 그 숫자를

20 자리의 xxx,xxx,xxx 형태로 출력하세요.

 

만약 출력 문자열의 자릿수가 20 자리가 안되면 앞에 '0' 을 붙여주세요.

 

예를 들어 1234567 을 터미널에서 입력했으면 000000000001,234,567 와 같이 출력하세요.

 

A) 이 문제의 문제점은 print() 문의 format 을 적용하여야 하고

     또 문제 하나는 숫자들 사이에 천단위 별로 콤마를 삽입해야 한다는 것입니다.

 

(추가 업데이트)

기존에는 입력받은 숫자 즉 String에서 콤마를 넣기 위해 Separator 라는 crate를 사용했습니다.

그리고 println!() 에서 format string을 적용하였습니다.

 

crate 이용한 방법은 하기 링크에서

  :=> open-support.tistory.com/entry/rust-%EC%97%90%EC%84%9C-print%EC%9D%98-format-%EA%B4%80%EB%A0%A8-%EB%82%B4%EC%9A%A9?category=1194796

 

 

그런데

이번에는 Separator 라는 crate를 사용하지 않고 아래와 같이 해결하였습니다.

 

(추가 업데이트)

우선, 아래 코드를 보시면

    다음 링크와 같이, String의 요소 하나하나를 indexing 하는 방법을 알아야 합니다.

    - 참고 링크:=> open-support.tistory.com/entry/rust-%EC%97%90%EC%84%9C-String-%EC%97%90%EC%84%9C-%EC%9A%94%EC%86%8C-%ED%95%98%EB%82%98-%ED%95%98%EB%82%98%EB%A5%BC-index-%EC%9D%B8%EB%8D%B1%EC%8B%B1-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95?category=1194796

 

위 링크와 같이 String을 인텍싱하는 방법을 이용하여

     그리고 마지막으로 println!()에서 format string을 아래 링크와 같이 이용하여

         코드를 작성했습니다.

         - 참고링크:=> open-support.tistory.com/entry/rust-%EC%97%90%EC%84%9C-print%EC%9D%98-format-%EA%B4%80%EB%A0%A8-%EB%82%B4%EC%9A%A9?category=1194796

 

 결국,

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

    }

}

 

그럼, 

   정보 공유합니다.

 

 

 

 

728x90