1use crate::{Currency, CurrencyLocale};
2use std::ops::Div;
3
4impl<L: CurrencyLocale> Div<usize> for Currency<L> {
5 type Output = Self;
6
7 fn div(self, rhs: usize) -> Self::Output {
8 Self::new(self.negative, self.amount / rhs, self.locale)
9 }
10}
11
12impl<L: CurrencyLocale> Div<isize> for Currency<L> {
13 type Output = Self;
14
15 fn div(self, rhs: isize) -> Self::Output {
16 Self::new(
17 self.negative ^ rhs.is_negative(),
18 self.amount / rhs.unsigned_abs(),
19 self.locale,
20 )
21 }
22}
23
24impl<L: CurrencyLocale + Default> Div<f32> for Currency<L> {
25 type Output = Self;
26
27 fn div(self, rhs: f32) -> Self::Output {
28 Self::new(
29 self.negative ^ rhs.is_sign_negative(),
30 self.amount * 100 / (rhs * 100.0).abs() as usize,
32 self.locale,
33 )
34 }
35}
36
37impl<L: CurrencyLocale + Default> Div<f64> for Currency<L> {
38 type Output = Self;
39
40 fn div(self, rhs: f64) -> Self::Output {
41 Self::new(
42 self.negative ^ rhs.is_sign_negative(),
43 self.amount * 100 / (rhs * 100.0).abs() as usize,
45 self.locale,
46 )
47 }
48}
49
50#[cfg(test)]
51mod test {
52 use super::*;
53
54 #[derive(Clone, Copy, Default, Debug, PartialEq)]
55 enum CurrencyL {
56 #[default]
57 De,
58 }
59
60 impl CurrencyLocale for CurrencyL {
61 fn separator(&self) -> char {
62 ','
63 }
64
65 fn thousand_separator(&self) -> char {
66 '.'
67 }
68
69 fn currency_symbol(&self) -> &'static str {
70 "€"
71 }
72 }
73
74 #[test]
75 fn div_usize() {
76 let curr = Currency::new(false, 2_22, CurrencyL::De);
77
78 let expected = curr / 2usize;
79 assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
80 }
81
82 #[test]
83 fn div_isize() {
84 let curr = Currency::new(false, 2_22, CurrencyL::De);
85
86 let expected = curr / 2isize;
87 assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
88 }
89
90 #[test]
91 fn div_isize_negative() {
92 let curr = Currency::new(false, 2_22, CurrencyL::De);
93
94 let expected = curr / -2isize;
95 assert_eq!(expected, Currency::new(true, 1_11, CurrencyL::De));
96 }
97
98 #[test]
99 fn div_negative_isize_negative() {
100 let curr = Currency::new(true, 2_22, CurrencyL::De);
101
102 let expected = curr / -2isize;
103 assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
104 }
105
106 #[test]
107 fn div_negative_isize() {
108 let curr = Currency::new(true, 2_22, CurrencyL::De);
109
110 let expected = curr / 2isize;
111 assert_eq!(expected, Currency::new(true, 1_11, CurrencyL::De));
112 }
113
114 #[test]
115 fn div_f32() {
116 let curr = Currency::new(false, 2_22, CurrencyL::De);
117
118 let expected = curr / 2.0f32;
119 assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
120 }
121
122 #[test]
123 fn div_negative_f32() {
124 let curr = Currency::new(false, 2_22, CurrencyL::De);
125
126 let expected = curr / -2.0f32;
127 assert_eq!(expected, Currency::new(true, 1_11, CurrencyL::De));
128 }
129
130 #[test]
131 fn div_fraction_f32() {
132 let curr = Currency::new(false, 2_22, CurrencyL::De);
133
134 let expected = curr / 0.5f32;
135 assert_eq!(expected, Currency::new(false, 4_44, CurrencyL::De));
136 }
137
138 #[test]
139 fn div_fraction_negative_f32() {
140 let curr = Currency::new(false, 2_22, CurrencyL::De);
141
142 let expected = curr / -0.5f32;
143 assert_eq!(expected, Currency::new(true, 4_44, CurrencyL::De));
144 }
145
146 #[test]
147 fn div_f64() {
148 let curr = Currency::new(false, 2_22, CurrencyL::De);
149
150 let expected = curr / 2.0f64;
151 assert_eq!(expected, Currency::new(false, 1_11, CurrencyL::De));
152 }
153
154 #[test]
155 fn div_negative_f64() {
156 let curr = Currency::new(false, 2_22, CurrencyL::De);
157
158 let expected = curr / -2.0f64;
159 assert_eq!(expected, Currency::new(true, 1_11, CurrencyL::De));
160 }
161
162 #[test]
163 fn div_fraction_f64() {
164 let curr = Currency::new(false, 2_22, CurrencyL::De);
165
166 let expected = curr / 0.5f64;
167 assert_eq!(expected, Currency::new(false, 4_44, CurrencyL::De));
168 }
169
170 #[test]
171 fn div_fraction_negative_f64() {
172 let curr = Currency::new(false, 2_22, CurrencyL::De);
173
174 let expected = curr / -0.5f64;
175 assert_eq!(expected, Currency::new(true, 4_44, CurrencyL::De));
176 }
177}