rust_decimal 0.2.0

A Decimal Implementation written in pure Rust suitable for financial calculations.
Documentation
use Decimal;

use num::{FromPrimitive, Zero};
use serde;

use std::fmt;
use std::str::FromStr;

impl<'de> serde::Deserialize<'de> for Decimal {
    fn deserialize<D>(deserializer: D) -> Result<Decimal, D::Error>
        where D: serde::de::Deserializer<'de> {
        deserializer.deserialize_any(DecimalVisitor)
    }
}

struct DecimalVisitor;

impl<'de> serde::de::Visitor<'de> for DecimalVisitor {
    type Value = Decimal;

    fn visit_i16<E>(self, value: i16) -> Result<Decimal, E> {
        match Decimal::from_i32(value as i32) {
            Some(s) => Ok(s),
            None => Ok(Decimal::zero()),
        }
    }

    fn visit_i32<E>(self, value: i32) -> Result<Decimal, E> {
        match Decimal::from_i32(value) {
            Some(s) => Ok(s),
            None => Ok(Decimal::zero()),
        }
    }

    fn visit_str<E>(self, value: &str) -> Result<Decimal, E> {
        match Decimal::from_str(value) {
            Ok(s) => Ok(s),
            Err(_) => Ok(Decimal::zero()),
        }
    }

    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
        write!(formatter, "a Decimal type representing a fixed-point number")
    }
}

impl serde::Serialize for Decimal {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
        where S: serde::Serializer {
        serializer.serialize_str(&self.to_string())
    }
}