const DIGITS: [char; 10] = ['영', '일', '이', '삼', '사', '오', '육', '칠', '팔', '구'];
const EXPS_UNTIL_1000: [char; 3] = ['십', '백', '천'];
const EXPS: [char; 12] = [
'만', '억', '조', '경', '해', '자', '양', '溝', '간', '정', '재', '극',
];
pub fn is_digits(num: char) -> bool {
num.is_ascii_digit()
}
fn change_int_char(num: char) -> char {
let idx = num as usize - '0' as usize;
DIGITS[idx]
}
pub fn change_num_to_hangeul(num: &str) -> String {
let char_vec: Vec<char> = num.chars().rev().collect();
if char_vec.len() == 1 {
change_int_char(char_vec[0]).to_string()
} else {
let mut temp_result: Vec<char> = Vec::new();
let mut temp_exps = 0;
for (i, x) in char_vec.iter().enumerate() {
let num_char = change_int_char(*x);
temp_result.push(num_char);
temp_result.push(' ');
if ((i + 1) % 4) == 0 {
temp_result.push(EXPS[temp_exps]);
temp_exps += 1;
} else if ((i + 1) % 4) == 1 {
temp_result.push(EXPS_UNTIL_1000[0]);
} else if ((i + 1) % 4) == 2 {
temp_result.push(EXPS_UNTIL_1000[1]);
} else {
temp_result.push(EXPS_UNTIL_1000[2]);
}
}
temp_result.pop();
temp_result.reverse();
let mut temp_result: String = temp_result.iter().collect();
temp_result = temp_result.replace("영천", "");
temp_result = temp_result.replace("영백", "");
temp_result = temp_result.replace("영십", "");
temp_result = temp_result.replace('영', "");
temp_result = temp_result.replace(" ", " ");
temp_result = temp_result.replace(' ', "");
let mut last_temp: Vec<char> = Vec::new();
for i in temp_result.chars() {
if EXPS.contains(&i) {
if let Some(&last_char) = last_temp.last() {
if !EXPS.contains(&last_char) {
last_temp.push(i);
}
}
} else {
last_temp.push(i);
}
}
let mut temp_result: String = last_temp.iter().collect();
temp_result = temp_result.replace('溝', "구");
temp_result = temp_result.replace("일만", "만");
temp_result = temp_result.replace("일천", "천");
temp_result = temp_result.replace("일백", "백");
temp_result = temp_result.replace("일십", "십");
temp_result = temp_result.replace(" ", " ");
temp_result = temp_result.replace(' ', "");
temp_result
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn _is_digits() {
let temp = '5';
assert_eq!(true, is_digits(temp));
let temp = '일';
assert_eq!(false, is_digits(temp));
let temp = '영';
assert_eq!(false, is_digits(temp));
let temp = ' ';
assert_eq!(false, is_digits(temp));
let temp = '😀';
assert_eq!(false, is_digits(temp));
}
#[test]
fn _change_int_char() {
let temp = '1';
assert_eq!('일', change_int_char(temp));
let temp = '2';
assert_eq!('이', change_int_char(temp));
let temp = '3';
assert_eq!('삼', change_int_char(temp));
let temp = '4';
assert_eq!('사', change_int_char(temp));
let temp = '5';
assert_eq!('오', change_int_char(temp));
let temp = '6';
assert_eq!('육', change_int_char(temp));
let temp = '7';
assert_eq!('칠', change_int_char(temp));
let temp = '8';
assert_eq!('팔', change_int_char(temp));
let temp = '9';
assert_eq!('구', change_int_char(temp));
let temp = '0';
assert_eq!('영', change_int_char(temp));
}
}