본문 바로가기

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

rust 에서 print()의 format 관련 내용

728x90

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

 

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

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

 

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

 

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

 

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

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

 

    우선, string으로 number를 입력 받아 이를 다시 u32 타입으로 변환하고

    이렇게 변환된 number를 천단위로 콤마를 넣기 위해 separator 라는 crate를 이용했습니다.

    (crate없이 하려니 아직 능력 부족 TT)

   그리고 마지막에 zero padding을 하는 것은 println!() 안의 format string을 하기 링크에서

   확인하고 적용했습니다.

    - 참고1:=> https://docs.rs/pad/0.1.6/pad/

    - 참고2:=> https://doc.rust-lang.org/rust-by-example/hello/print.html

 

결론은 zero padding을 하기 위해 format string은  {:0>20} 를

아래 코드와 같이 적용했습니다.

 

그럼

   최종 코드를 공유합니다.

 

extern crate separator;

use separator::Separatable;

use std::io;

fn main(){

    println!("Program start!");

    loop {
        println!("Please input your number.");

        let mut guess = String::new();

        io::stdin().read_line(&mut guess)
            .expect("Failed to read line");

        let in_num: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => {
                println!("Error: you have to input number!");
                continue
            },
        };

        let formatted_num = in_num.separated_string();

        println!("The result is {:0>20}", formatted_num);

    }

}

 

정리하면,

   간단해보이지만,

   Rust 에서 해결해야할 점들이 크게 두가지가 있었습니다. 그럼 공유합니다.

 

추가로,

   위 코드의 깃허브도 공유합니다.

:=> https://github.com/opensupport-ceo/rust-learning-on-web/blob/main/rust-learn-data/lecture1/ex3/src/main.rs

 

 

(광고1)

이젠 여기저기 있는 중고거래앱들을 번거롭게 일일이 찾아드릴 필요가 없이 '무료나눔'앱 이거 하나만으로 중고거래앱들의 무료로 나눔하는 물품들을 검색해 볼 수 있습니다. 하기에서 다운로드 가능합니다.

:=> https://play.google.com/store/apps/details?id=com.opensupport.freenanumG

 

무료나눔, 그냥드림, 중고거래 (한번의 검색으로 모든 중고장터를 득템하자!) - Google Play 앱

무료로 원하는 아이템을 득템하자!

play.google.com

 

 

그럼,

    공유합니다.