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 withfunction(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 theg
it will only match the first occurrence, otherwise it will match all the occurrences.- In this case for every English digit
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]
)- but this time we can’t do that because
'1234'['۱']
is invalid. so we use a trick here and useindexOf
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 us3
because'۳'
is the third index in the string'۰۱۲۳۴۵۶۷۸۹'