Rust's parse() method doesn't like the dollar sign, so I used scanf instead :3
extern crate libc;
use libc::scanf;
struct Change {
pennies: u32,
nickels: u32,
dimes: u32,
quarters: u32,
}
impl Change {
fn print(self) {
let pstr = match self.pennies {
0 => String::new(),
1 => String::from("1 Penny "),
p => format!("{} Pennies ", p),
};
let nstr = match self.nickels {
0 => String::new(),
1 => String::from("1 Nickel "),
n => format!("{} Nickels ", n),
};
let dstr = match self.dimes {
0 => String::new(),
1 => String::from("1 Dime "),
d => format!("{} Dimes ", d),
};
let qstr = match self.quarters {
0 => String::new(),
1 => String::from("1 Quarter "),
q => format!("{} Quarters ", q),
};
println!("{}{}{}{}", qstr, dstr, nstr, pstr);
}
}
fn to_change(cents: u32) -> Change {
Change {
pennies: cents % 5,
nickels: if ((cents % 25) % 10) > 5 { 1 } else { 0 },
dimes: (cents % 25) / 10,
quarters: cents / 25,
}
}
fn main() {
let mut dollars: f32 = 0.0;
let fmtstr = b"$%f\0";
unsafe { scanf(fmtstr.as_ptr() as *const i8, &mut dollars); }
if dollars < 0.0 { panic!("Cannot parse negative money"); }
let cents = (dollars * 100.0) as u32;
to_change(cents).print();
}