1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::char;
use std::string::String;

const PERSIAN_TO_ENGLISH_DIFF: u32 = '۰' as u32 - '0' as u32;

/// Converts all Persian digits to English digits.
///
/// # Examples
///
/// ```
/// assert_eq!(persian::persian_to_english_digits("۰۱۲۳۴۵۶۷۸۹"), "0123456789");
/// ```
pub fn persian_to_english_digits(s: &str) -> String {
    let mut buf = String::with_capacity(s.len());
    for c in s.chars() {
        let c_ = match c {
            '۰' ... '۹' => char::from_u32(c as u32 - PERSIAN_TO_ENGLISH_DIFF).unwrap(),
            _ => c,
        };

        buf.push(c_)
    }

    buf
}

/// Converts all English digits to Persian digits.
///
/// # Examples
///
/// ```
/// assert_eq!(persian::english_to_persian_digits("0123456789"), "۰۱۲۳۴۵۶۷۸۹");
/// ```
pub fn english_to_persian_digits(s: &str) -> String {
    let mut buf = String::with_capacity(s.len());

    for c in s.chars() {
        let c_ = match c {
            '0' ... '9' => char::from_u32(c as u32 + PERSIAN_TO_ENGLISH_DIFF).unwrap(),
            _ => c,
        };

        buf.push(c_)
    }

    buf
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn persian_to_english_digits_test() {
        assert_eq!(persian_to_english_digits("۰۱۲۳۴۵۶۷۸۹"), "0123456789");
        assert_eq!(persian_to_english_digits("0123456789"), "0123456789");
        assert_eq!(persian_to_english_digits("0۱2۳4۵6۷8۹"), "0123456789");
        assert_eq!(persian_to_english_digits("۰1۲3۴5۶7۸9"), "0123456789");
        assert_eq!(persian_to_english_digits("hello ۰۰۱"), "hello 001");
        assert_eq!(persian_to_english_digits("۰۰۰۰"), "0000");
        assert_eq!(persian_to_english_digits("۰۰۰۰"), "0000");
    }

    #[test]
    fn persian_to_english_digits_arabic_test() {
        assert_eq!(persian_to_english_digits("٠١٢٣٤٥٦٧٨٩"), "٠١٢٣٤٥٦٧٨٩");
        assert_eq!(persian_to_english_digits("۰۱۲۳۴۵۶۷۸۹ ٠١٢٣٤٥٦٧٨٩"), "0123456789 ٠١٢٣٤٥٦٧٨٩");
    }

    #[test]
    fn english_to_persian_digits_test() { 
        assert_eq!(english_to_persian_digits("0123456789"), "۰۱۲۳۴۵۶۷۸۹");
        assert_eq!(english_to_persian_digits("۰۱۲۳۴۵۶۷۸۹"), "۰۱۲۳۴۵۶۷۸۹");
        assert_eq!(english_to_persian_digits("0۱2۳4۵6۷8۹"), "۰۱۲۳۴۵۶۷۸۹");
        assert_eq!(english_to_persian_digits("۰1۲3۴5۶7۸9"), "۰۱۲۳۴۵۶۷۸۹");
        assert_eq!(english_to_persian_digits("hello 001"), "hello ۰۰۱");
        assert_eq!(english_to_persian_digits("0000"), "۰۰۰۰");
        assert_eq!(english_to_persian_digits("0000"), "۰۰۰۰");
    }
}