Serenity Operating System
1/*
2 * Copyright (c) 2021, Tim Flynn <trflynn89@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibUnicode/CurrencyCode.h>
8
9namespace Unicode {
10
11static auto const& ensure_currency_codes()
12{
13 // https://www.iso.org/iso-4217-currency-codes.html
14 // https://www.six-group.com/dam/download/financial-information/data-center/iso-currrency/amendments/lists/list_one.xml
15 static HashMap<StringView, CurrencyCode> currency_codes {
16 { "AED"sv, { 2 } },
17 { "AFN"sv, { 2 } },
18 { "ALL"sv, { 2 } },
19 { "AMD"sv, { 2 } },
20 { "ANG"sv, { 2 } },
21 { "AOA"sv, { 2 } },
22 { "ARS"sv, { 2 } },
23 { "AUD"sv, { 2 } },
24 { "AWG"sv, { 2 } },
25 { "AZN"sv, { 2 } },
26 { "BAM"sv, { 2 } },
27 { "BBD"sv, { 2 } },
28 { "BDT"sv, { 2 } },
29 { "BGN"sv, { 2 } },
30 { "BHD"sv, { 3 } },
31 { "BIF"sv, { 0 } },
32 { "BMD"sv, { 2 } },
33 { "BND"sv, { 2 } },
34 { "BOB"sv, { 2 } },
35 { "BOV"sv, { 2 } },
36 { "BRL"sv, { 2 } },
37 { "BSD"sv, { 2 } },
38 { "BTN"sv, { 2 } },
39 { "BWP"sv, { 2 } },
40 { "BYN"sv, { 2 } },
41 { "BZD"sv, { 2 } },
42 { "CAD"sv, { 2 } },
43 { "CDF"sv, { 2 } },
44 { "CHE"sv, { 2 } },
45 { "CHF"sv, { 2 } },
46 { "CHW"sv, { 2 } },
47 { "CLF"sv, { 4 } },
48 { "CLP"sv, { 0 } },
49 { "CNY"sv, { 2 } },
50 { "COP"sv, { 2 } },
51 { "COU"sv, { 2 } },
52 { "CRC"sv, { 2 } },
53 { "CUC"sv, { 2 } },
54 { "CUP"sv, { 2 } },
55 { "CVE"sv, { 2 } },
56 { "CZK"sv, { 2 } },
57 { "DJF"sv, { 0 } },
58 { "DKK"sv, { 2 } },
59 { "DOP"sv, { 2 } },
60 { "DZD"sv, { 2 } },
61 { "EGP"sv, { 2 } },
62 { "ERN"sv, { 2 } },
63 { "ETB"sv, { 2 } },
64 { "EUR"sv, { 2 } },
65 { "FJD"sv, { 2 } },
66 { "FKP"sv, { 2 } },
67 { "GBP"sv, { 2 } },
68 { "GEL"sv, { 2 } },
69 { "GHS"sv, { 2 } },
70 { "GIP"sv, { 2 } },
71 { "GMD"sv, { 2 } },
72 { "GNF"sv, { 0 } },
73 { "GTQ"sv, { 2 } },
74 { "GYD"sv, { 2 } },
75 { "HKD"sv, { 2 } },
76 { "HNL"sv, { 2 } },
77 { "HRK"sv, { 2 } },
78 { "HTG"sv, { 2 } },
79 { "HUF"sv, { 2 } },
80 { "IDR"sv, { 2 } },
81 { "ILS"sv, { 2 } },
82 { "INR"sv, { 2 } },
83 { "IQD"sv, { 3 } },
84 { "IRR"sv, { 2 } },
85 { "ISK"sv, { 0 } },
86 { "JMD"sv, { 2 } },
87 { "JOD"sv, { 3 } },
88 { "JPY"sv, { 0 } },
89 { "KES"sv, { 2 } },
90 { "KGS"sv, { 2 } },
91 { "KHR"sv, { 2 } },
92 { "KMF"sv, { 0 } },
93 { "KPW"sv, { 2 } },
94 { "KRW"sv, { 0 } },
95 { "KWD"sv, { 3 } },
96 { "KYD"sv, { 2 } },
97 { "KZT"sv, { 2 } },
98 { "LAK"sv, { 2 } },
99 { "LBP"sv, { 2 } },
100 { "LKR"sv, { 2 } },
101 { "LRD"sv, { 2 } },
102 { "LSL"sv, { 2 } },
103 { "LYD"sv, { 3 } },
104 { "MAD"sv, { 2 } },
105 { "MDL"sv, { 2 } },
106 { "MGA"sv, { 2 } },
107 { "MKD"sv, { 2 } },
108 { "MMK"sv, { 2 } },
109 { "MNT"sv, { 2 } },
110 { "MOP"sv, { 2 } },
111 { "MRU"sv, { 2 } },
112 { "MUR"sv, { 2 } },
113 { "MVR"sv, { 2 } },
114 { "MWK"sv, { 2 } },
115 { "MXN"sv, { 2 } },
116 { "MXV"sv, { 2 } },
117 { "MYR"sv, { 2 } },
118 { "MZN"sv, { 2 } },
119 { "NAD"sv, { 2 } },
120 { "NGN"sv, { 2 } },
121 { "NIO"sv, { 2 } },
122 { "NOK"sv, { 2 } },
123 { "NPR"sv, { 2 } },
124 { "NZD"sv, { 2 } },
125 { "OMR"sv, { 3 } },
126 { "PAB"sv, { 2 } },
127 { "PEN"sv, { 2 } },
128 { "PGK"sv, { 2 } },
129 { "PHP"sv, { 2 } },
130 { "PKR"sv, { 2 } },
131 { "PLN"sv, { 2 } },
132 { "PYG"sv, { 0 } },
133 { "QAR"sv, { 2 } },
134 { "RON"sv, { 2 } },
135 { "RSD"sv, { 2 } },
136 { "RUB"sv, { 2 } },
137 { "RWF"sv, { 0 } },
138 { "SAR"sv, { 2 } },
139 { "SBD"sv, { 2 } },
140 { "SCR"sv, { 2 } },
141 { "SDG"sv, { 2 } },
142 { "SEK"sv, { 2 } },
143 { "SGD"sv, { 2 } },
144 { "SHP"sv, { 2 } },
145 { "SLL"sv, { 2 } },
146 { "SOS"sv, { 2 } },
147 { "SRD"sv, { 2 } },
148 { "SSP"sv, { 2 } },
149 { "STN"sv, { 2 } },
150 { "SVC"sv, { 2 } },
151 { "SYP"sv, { 2 } },
152 { "SZL"sv, { 2 } },
153 { "THB"sv, { 2 } },
154 { "TJS"sv, { 2 } },
155 { "TMT"sv, { 2 } },
156 { "TND"sv, { 3 } },
157 { "TOP"sv, { 2 } },
158 { "TRY"sv, { 2 } },
159 { "TTD"sv, { 2 } },
160 { "TWD"sv, { 2 } },
161 { "TZS"sv, { 2 } },
162 { "UAH"sv, { 2 } },
163 { "UGX"sv, { 0 } },
164 { "USD"sv, { 2 } },
165 { "USN"sv, { 2 } },
166 { "UYI"sv, { 0 } },
167 { "UYU"sv, { 2 } },
168 { "UYW"sv, { 4 } },
169 { "UZS"sv, { 2 } },
170 { "VES"sv, { 2 } },
171 { "VND"sv, { 0 } },
172 { "VUV"sv, { 0 } },
173 { "WST"sv, { 2 } },
174 { "XAF"sv, { 0 } },
175 { "XAG"sv, { {} } },
176 { "XAU"sv, { {} } },
177 { "XBA"sv, { {} } },
178 { "XBB"sv, { {} } },
179 { "XBC"sv, { {} } },
180 { "XBD"sv, { {} } },
181 { "XCD"sv, { 2 } },
182 { "XDR"sv, { {} } },
183 { "XOF"sv, { 0 } },
184 { "XPD"sv, { {} } },
185 { "XPF"sv, { 0 } },
186 { "XPT"sv, { {} } },
187 { "XSU"sv, { {} } },
188 { "XTS"sv, { {} } },
189 { "XUA"sv, { {} } },
190 { "XXX"sv, { {} } },
191 { "YER"sv, { 2 } },
192 { "ZAR"sv, { 2 } },
193 { "ZMW"sv, { 2 } },
194 { "ZWL"sv, { 2 } },
195 };
196
197 return currency_codes;
198}
199
200Optional<CurrencyCode> get_currency_code(StringView currency)
201{
202 static auto const& currency_codes = ensure_currency_codes();
203 return currency_codes.get(currency);
204}
205
206}