From 36d5ff553a1d65d70da5251b8865d62294c929f6 Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Sun, 7 Mar 2021 09:12:47 -0700 Subject: tear it all up and implement super basic actors --- src/number.rs | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'src/number.rs') diff --git a/src/number.rs b/src/number.rs index a71399c..94a67f1 100644 --- a/src/number.rs +++ b/src/number.rs @@ -1,7 +1,10 @@ +use std::cmp::max; +use std::fmt::{Display, Formatter, Result as FormatResult}; +use std::ops::Add; + #[derive(Clone)] pub struct Number { pub integer_part: String, - pub fractional_part: String, } macro_rules! int_conv { @@ -10,7 +13,6 @@ macro_rules! int_conv { fn from(x: $t) -> Number { Number { integer_part: x.to_string(), - fractional_part: "".to_string(), } } } @@ -18,3 +20,36 @@ macro_rules! int_conv { } int_conv!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize); + +impl Display for Number { + fn fmt(&self, f: &mut Formatter<'_>) -> FormatResult { + f.write_str(&self.integer_part) + } +} + +impl Add for Number { + type Output = Number; + + fn add(self, rhs: Self) -> Self::Output { + let longest_ipart_len = max(self.integer_part.len(), rhs.integer_part.len()); + let self_padded = format!("{:0>len$}", self.integer_part, len=longest_ipart_len); + let rhs_padded = format!("{:0>len$}", rhs.integer_part, len=longest_ipart_len); + let mut result_ipart_reverse = "".to_string(); + let mut carry: u8 = 0; + for (self_char, rhs_char) in self_padded.chars().rev().zip(rhs_padded.chars().rev()) { + let self_char_val = self_char.to_digit(10).unwrap() as u8; + let rhs_char_val = rhs_char.to_digit(10).unwrap() as u8; + let sum = self_char_val + rhs_char_val + carry; + let sum_last_digit = (sum % 10).to_string().chars().next().unwrap(); + carry = sum / 10; + result_ipart_reverse.push(sum_last_digit); + } + if carry > 0 { + result_ipart_reverse.push_str(&carry.to_string()); + } + let result_ipart = result_ipart_reverse.chars().rev().collect(); + Number { + integer_part: result_ipart, + } + } +} -- cgit v1.2.3