18

I am using the following JavaScript to convert all the English numbers showing on my website to Persian.

I realize that there are several ways to go about this and I have looked online and tried a few, however, this script does what I want it to do and it was really easy to implement except I want the phone number and date in my footer to be excluded from the conversion and remain English.

Not sure how I go about this in my PHP/HTML page.

On the second note, when my site is loading for a couple of seconds the numbers appear in English and quickly convert to Persian. Just wondering if there was a way that I could reduce this delay?

Here is my code:

<script language="JavaScript" type="text/javascript">
var replaceDigits = function() {
var map =
[
"&\#1776;","&\#1777;","&\#1778;","&\#1779;","&\#1780;",
"&\#1781;","&\#1782;","&\#1783;","&\#1784;","&\#1785;"
]
document.body.innerHTML =
document.body.innerHTML.replace(
/\d(?=[^<>]*(<|$))/g,
function($0) { return map[$0] }
);
}
</script>

<script type="text/javascript">
window.onload = replaceDigits
</script>
John Doe
  • 225
  • 2
  • 5
  • 11
  • 1
    I used `window.onload = replaceDigits` in my code an it resulted in horrible undefined behavior. I strongly recommend against using such methods... – yukashima huksay Feb 04 '19 at 21:18

11 Answers11

36

Here you are :)

function toFarsiNumber(n) {
    const farsiDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];

    return n
      .toString()
      .split('')
      .map(x => farsiDigits[x])
      .join('');
  }

Another version!

function toFarsiNumber(n) {
    const farsiDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];

    return n
        .toString()
        .replace(/\d/g, x => farsiDigits[x]);
}
Yas
  • 4,957
  • 2
  • 41
  • 24
18

Here is the PHP function :

function toPersianNum($number)
    {
        $number = str_replace("1","۱",$number);
        $number = str_replace("2","۲",$number);
        $number = str_replace("3","۳",$number);
        $number = str_replace("4","۴",$number);
        $number = str_replace("5","۵",$number);
        $number = str_replace("6","۶",$number);
        $number = str_replace("7","۷",$number);
        $number = str_replace("8","۸",$number);
        $number = str_replace("9","۹",$number);
        $number = str_replace("0","۰",$number);
        return $number;
    }

Using :

$fa_num = toPersianNum(1234); // It returns ۱۲۳۴
$fa_date = toPersianNum('2016/05/10'); // It returns ۲۰۱۶/۰۵/۱۰

JavaScript

And here is the JavaScript function :

function toPersianNum( num, dontTrim ) {

    var i = 0,

        dontTrim = dontTrim || false,

        num = dontTrim ? num.toString() : num.toString().trim(),
        len = num.length,

        res = '',
        pos,

        persianNumbers = typeof persianNumber == 'undefined' ?
            ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'] :
            persianNumbers;

    for (; i < len; i++)
        if (( pos = persianNumbers[num.charAt(i)] ))
            res += pos;
        else
            res += num.charAt(i);

    return res;
}

Using :

var fa_num = toPersianNum(1234) // It returns ۱۲۳۴
var fa_date = toPersianNum('2016/05/10'); // It returns ۲۰۱۶/۰۵/۱۰

Be Happy :)

UPDATE

Here are toEnglishNum() as well.

PHP:

function toEnglishNum($number)
{
    $number = str_replace("۱","1",$number);
    $number = str_replace("۲","2",$number);
    $number = str_replace("۳","3",$number);
    $number = str_replace("۴","4",$number);
    $number = str_replace("۵","5",$number);
    $number = str_replace("۶","6",$number);
    $number = str_replace("۷","7",$number);
    $number = str_replace("۸","8",$number);
    $number = str_replace("۹","9",$number);
    $number = str_replace("۰","0",$number);
    return $number;
}

Javascript:

function toEnglishNum( num, dontTrim ) {
    var i = 0,
        j = 0,
        dontTrim = dontTrim || false,
        num = dontTrim ? num.toString() : num.toString().trim(),
        len = num.length,
        res = '',
        pos,
        persianNumbers = typeof persianNumber == 'undefined' ?
            [ '۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹' ] :
            persianNumbers;

    for ( ; i < len; i++ )
        if ( ~( pos = persianNumbers.indexOf( num.charAt( i ) ) ) )
            res += pos;
        else
            res += num.charAt( i );
    return res;
};

Good Luck

Hamed Kamrava
  • 12,359
  • 34
  • 87
  • 125
  • Deserved 1 point for JavaScript, That is proper to add toEnglishNumber function too. – QMaster Nov 25 '17 at 14:42
  • 1
    @QMaster Thank you for your suggestion. `toEnglshNumber()` added. – Hamed Kamrava Nov 26 '17 at 14:07
  • Your welcome @hamed, Thank you for improving answer and I wonder if you look at this: https://stackoverflow.com/a/45541282/1830909 answer and write your thought, Thanks again. – QMaster Nov 27 '17 at 12:09
6

the answer is too simple

const a = 1234567890
console.log(new Number(a).toLocaleString('fa-ir')) //۱۲۳۴۵۶۷۸۹۰
Hadi
  • 101
  • 1
  • 4
2

put any persian number in faToEnDigits and it return english digits to you.

faToEnDigits(۱۲۳۴) => 1234

enToFaDigits(1234) => ۱۲۳۴
var faToEnDigits = function (input) {
        if (input == undefined)
            return;
        var returnModel = "", symbolMap = {
            '۱': '1',
            '۲': '2',
            '۳': '3',
            '۴': '4',
            '۵': '5',
            '۶': '6',
            '۷': '7',
            '۸': '8',
            '۹': '9',
            '۰': '0'
        };
        input = input.toString();
        for (var i = 0; i < input.length; i++)
            if (symbolMap[input[i]])
                returnModel += symbolMap[input[i]];
            else
                returnModel += input[i];
        return returnModel;
}

var enToFaDigits = function (input) {
        if (input == undefined)
            return;
        var returnModel = "", symbolMap = {
            '1': '۱',
            '2': '۲',
            '3': '۳',
            '4': '۴',
            '5': '۵',
            '6': '۶',
            '7': '۷',
            '8': '۸',
            '9': '۹',
            '0': '۰'
        };
        input = input.toString();
        for (var i = 0; i < input.length; i++)
            if (symbolMap[input[i]])
                returnModel += symbolMap[input[i]];
            else
                returnModel += input[i];
        return returnModel;
    };
Kalagar
  • 379
  • 2
  • 6
  • 18
2

Try Persian-tools an awesome javascript library for this matter and also many other useful functionalities.

import { digitsArToFa, digitsArToEn, digitsEnToFa, digitsFaToEn } from "persian-tools2";

digitsArToFa("٠١٢٣٤٥٦٧٨٩"); // "۰۱۲۳۴۵۶۷۸۹"
digitsArToFa("۸۹123۴۵"); // "۸۹123۴۵"
digitsArToFa(456128); // "456128"
digitsArToFa("Text ٠١٢٣٤٥٦٧٨٩"); // "Text ۰۱۲۳۴۵۶۷۸۹"

digitsArToEn("٠١٢٣٤٥٦٧٨٩"); // "0123456789"
digitsArToEn("٨٩123٤٥"); // "8912345"
digitsArToEn(456128); // "456128"

digitsArToEn("Text ٠١٢٣٤٥٦٧٨٩"); // "Text 0123456789"

digitsEnToFa("123۴۵۶"); // "۱۲۳۴۵۶"
digitsEnToFa("٤٥٦"); // "٤٥٦"
digitsEnToFa("123۴۵۶"); // "۱۲۳۴۵۶"

digitsFaToEn("123۴۵۶"); // "123456"
digitsFaToEn("۸۹123۴۵"); // "8912345"
digitsFaToEn("۰۱۲۳۴۵۶۷۸۹"); // "0123456789"
Majid Shahabfar
  • 4,010
  • 2
  • 28
  • 36
1

You are calling your replaceDigits function on window.onload which runs when your page is loaded. that's why you notice the delay while converting.

there are some ways to handle it with Javascript, but I guess the best way would be converting the numbers in PHP side.

M Reza
  • 18,350
  • 14
  • 66
  • 71
1

I hope this code can help you.

'12345'.replace(/[0-9]/g, c => String.fromCharCode(c.charCodeAt(0) + 1728))
0

PHP =>

the best way is :

strtr(number_format($price), array('0' => '۰', '1' => '۱', '2' => '۲', '3' => '۳', '4' => '۴', '5' => '۵', '6' => '۶', '7' => '۷', '8' => '۸', '9' => '۹'));
Pirooz Jenabi
  • 440
  • 5
  • 7
0

heads up :

s.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])

and function :

let convert_english_numbers_to_persisn=(s)=>s.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])
-1

Below method replaces all Arabic numbers with English numbers and then replaces all English numbers to Persian numbers:

function (value) {
    for (var index = 0; index < 10; index++)
        value = value.replace(String.fromCharCode(index + 1632), index.toString()[0]);
    for (var index = 0; index < 10; index++)
        value = value.replace(index.toString()[0], String.fromCharCode(index + 1776));

    return value;
}
Homayoun Behzadian
  • 1,053
  • 9
  • 26
-1

$(document).ready(function () {

ConvertNumberToPersion();

});

$(document).ready(function () {

    ConvertNumberToPersion();
});

function ConvertNumberToPersion() {
    persian = { 0: '۰', 1: '۱', 2: '۲', 3: '۳', 4: '۴', 5: '۵', 6: '۶', 7: '۷', 8: '۸', 9: '۹' };
    function traverse(el) {
        if (el.nodeType == 3) {
            var list = el.data.match(/[0-9]/g);
            if (list != null && list.length != 0) {
                for (var i = 0; i < list.length; i++)
                    el.data = el.data.replace(list[i], persian[list[i]]);
            }
        }
        for (var i = 0; i < el.childNodes.length; i++) {
            traverse(el.childNodes[i]);
        }
    }
    traverse(document.body);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>999</li>
</ul>

function ConvertNumberToPersion() { persian = { 0: '۰', 1: '۱', 2: '۲', 3: '۳', 4: '۴', 5: '۵', 6: '۶', 7: '۷', 8: '۸', 9: '۹' }; function traverse(el) { if (el.nodeType == 3) { var list = el.data.match(/[0-9]/g); if (list != null && list.length != 0) { for (var i = 0; i < list.length; i++) el.data = el.data.replace(list[i], persian[list[i]]); } } for (var i = 0; i < el.childNodes.length; i++) { traverse(el.childNodes[i]); } } traverse(document.body); }

NimaDoustdar
  • 318
  • 3
  • 5