use slicestring::Slice;
pub enum Locale<Scheme> {
English,
German,
Canadian,
Swiss,
Swiss2,
Singapore,
Custom(Scheme),
}
pub struct Scheme<'a> {
pub (in crate) separator: &'a str,
pub (in crate) radix: &'a str,
}
pub fn custom() -> Scheme<'static> {
let s = Scheme{separator: "", radix: ""};
s
}
impl <'a>Scheme<'a> {
pub fn set_separator(self, sep: &'a str) -> Scheme {
let new = Scheme{separator: sep, radix: self.radix};
new
}
pub fn set_radix(self, com: &'a str) -> Scheme {
let new = Scheme{separator: self.separator, radix: com};
new
}
}
pub fn separate<T: ToString>(n: T, lang: Locale<Scheme>) -> String {
let s = n.to_string();
let (sep, radix) = get_separator(&lang);
let mut s2 = String::new();
let mut s1 = s.slice(0, match s.find(".") {
Some(index) => {
s2 = s.slice(index+1, s.len());
index
},
None => match s.find(",") {
Some(index) => {
s2 = s.slice(index+1, s.len());
index
},
None => s.len()
}
});
let mut i = 0;
while i <= s1.len() {
let a = s1.slice(0, s1.len()-i);
let b = s1.slice(s1.len()-i, s1.len());
s1 = format!("{}{}{}", a, sep, b);
i=i+4;
}
if &s1[0..1] == sep {
s1 = s1[1..s1.len()].to_string();
}
if &s1[s1.len()-1..s1.len()] == sep {
s1 = s1[0..s1.len()-1].to_string();
}
format!("{}{}{}", s1,
if s2 != "" {
radix
} else {
""
}, s2)
}
fn get_separator<'a>(lang: &'a Locale<Scheme>) -> (&'a str, &'a str) {
match lang {
Locale::English => (",", "."),
Locale::German => (".", ","),
Locale::Canadian => (" ", "."),
Locale::Swiss => ("'", "."),
Locale::Swiss2 => ("'", ","),
Locale::Singapore => (",", "ยท"),
Locale::Custom(s) => (s.separator, s.radix),
}
}