#[derive(Debug)]
struct PriceComma<T> {
data: T,
result: String,
}
trait Formatter {
fn fmt_number(&self) -> String;
fn big_num_i64_str(&self) -> String;
fn fmt_num_f64_str(&self) -> String;
fn fmt_num_str(&self) -> String;
}
impl<T> PriceComma<T> {
fn new(data: T, result: String) -> Self {
Self { data, result }
}
fn push(&mut self, data: T) {
self.data = data;
}
}
impl<T: Default> Default for PriceComma<T> {
fn default() -> Self {
Self::new(T::default(), String::new())
}
}
impl<T: ToString> Formatter for PriceComma<T> {
fn fmt_number(&self) -> String {
let mut formatted_number = String::new();
let mut count = 0;
let number_convert = self.data.to_string();
for c in number_convert.chars().rev() {
if count == 3 {
formatted_number.push(',');
count = 0;
}
formatted_number.push(c);
count += 1;
}
formatted_number.chars().rev().collect()
}
fn big_num_i64_str(&self) -> String {
let mut formatted_number = String::new();
let mut count = 0;
let number_convert = self.data.to_string();
for c in number_convert.chars().rev() {
if count == 3 {
formatted_number.push(',');
count = 0;
}
formatted_number.push(c);
count += 1;
}
formatted_number.chars().rev().collect()
}
fn fmt_num_f64_str(&self) -> String {
let mut formatted_number = String::new();
let mut count = 0;
let number_convert = self.data.to_string();
let mut number_point_raw = number_convert.split('.');
let integer_part = number_point_raw.next().unwrap();
let decimal_part = number_point_raw.next().unwrap_or("00");
for c in integer_part.chars().rev() {
if count == 3 {
formatted_number.push(',');
count = 0;
}
formatted_number.push(c);
count += 1;
}
formatted_number = formatted_number.chars().rev().collect();
formatted_number.push('.');
formatted_number.push_str(decimal_part);
formatted_number
}
fn fmt_num_str(&self) -> String {
let number = self.data.to_string();
let mut formatted_number = String::new();
let mut count = 0;
for c in number.chars().rev() {
if count == 3 {
formatted_number.push(',');
count = 0;
}
formatted_number.push(c);
count += 1;
}
formatted_number.chars().rev().collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn num_new_fn_test() {
let mut price_comma = PriceComma::new(0, "".to_string());
price_comma.push(11111178);
let formatted_number = price_comma.fmt_number();
println!("(fn new)i32 Formatted number: {}", formatted_number);
}
#[test]
fn i32num_test() {
let price_comma = PriceComma {
data: 123456789,
result: String::new(),
};
let formatted_number = price_comma.fmt_number();
println!("i32 Formatted number: {}", formatted_number);
assert_eq!("123,456,789", formatted_number);
}
#[test]
fn i64num_big_num_test() {
let price_comma = PriceComma {
data: 1234567891233551324234234_i128,
result: String::new(),
};
let formatted_number = price_comma.big_num_i64_str();
println!("i128 (Big Number)Formatted number: {}", formatted_number);
assert_eq!("1,234,567,891,233,551,324,234,234", formatted_number);
}
#[test]
fn minus_i64num_big_num_test() {
let price_comma = PriceComma {
data: -1234567891233551324234234_i128,
result: String::new(),
};
let formatted_number = price_comma.big_num_i64_str();
println!(
"-i128 (Big Number, Minus)Formatted number: {}",
formatted_number
);
assert_eq!("-1,234,567,891,233,551,324,234,234", formatted_number);
}
#[test]
fn f64num_test() {
let price_comma = PriceComma {
data: 123456.789,
result: String::new(),
};
let formatted_number = price_comma.fmt_num_f64_str();
println!("f64 Number Formatted: {}", formatted_number);
assert_eq!("123,456.789", formatted_number);
}
#[test]
fn string_num_test() {
let price_comma = PriceComma {
data: "12345667".to_string(),
result: String::new(),
};
let formatted_number = price_comma.fmt_num_str();
println!("String Number Formatted: {}", formatted_number);
assert_eq!("12,345,667", formatted_number);
}
}