How can I convert Persian/Arabic numbers to English numbers with a simple function?
arabicNumbers = [\"١\", \"٢\", \"٣\", \"٤\", \"٥\", \"٦\", \"٧\", \"٨\",
Oneliner of all 6 possible translations between English, Arabic, and persian Digits.
const e2p = s => s.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])
const e2a = s => s.replace(/\d/g, d => '٠١٢٣٤٥٦٧٨٩'[d])
const p2e = s => s.replace(/[۰-۹]/g, d => '۰۱۲۳۴۵۶۷۸۹'.indexOf(d))
const a2e = s => s.replace(/[٠-٩]/g, d => '٠١٢٣٤٥٦٧٨٩'.indexOf(d))
const p2a = s => s.replace(/[۰-۹]/g, d => '٠١٢٣٤٥٦٧٨٩'['۰۱۲۳۴۵۶۷۸۹'.indexOf(d)])
const a2p = s => s.replace(/[٠-٩]/g, d => '۰۱۲۳۴۵۶۷۸۹'['٠١٢٣٤٥٦٧٨٩'.indexOf(d)])
e2p("asdf1234") // asdf۱۲۳۴
e2a("asdf1234") // asdf١٢٣٤
p2e("asdf۱۲۳۴") // asdf1234
a2e("asdf١٢٣٤") // asdf1234
p2a("asdf۱۲۳۴") // asdf١٢٣٤
a2p("asdf١٢٣٤") // asdf۱۲۳۴
Explaination:
(s => f(s))(x)
is a lambda function that is immediately executed, and will be equal to f(x)s.replace(pattern, function)
looks for matches of pattern in s, for every match m it will replace m with function(m)
in the string./\d/g
is a regex pattern, \d
means a digit in the English language, g
means global. If you don't specify the g
it will only match the first occurrence, otherwise it will match all the occurrences.d
in the string, that digit will be replaced by '۰۱۲۳۴۵۶۷۸۹'[d]
so, 3 will be replaced by the third index in that list('۰۱۲۳۴۵۶۷۸۹'
) which is '۳'/[۰-۹]/g
is the equivalent regex for Persian digits this time we can't use the same method, before we took advantage of the fact that javascript is dynamically typed and that d is automatically converted from a string(regex match) to a number(array index) (you can do '1234'['1']
in javascript which is the same as '1234'[1]
)'1234'['۱']
is invalid. so we use a trick here and use indexOf
which is a function that tells us the index of an element in an array(here a character in a string) so, '۰۱۲۳۴۵۶۷۸۹'.indexOf(۳)
will give us 3
because '۳'
is the third index in the string '۰۱۲۳۴۵۶۷۸۹'