преобразовать строку в персидский числовой формат

Например, у меня есть числовая строка в персидских числах.

۱۱۲۵۱۲۰۱۲۴

что означает 1125120124 на английском языке. Я хочу преобразовать эту строку в числовой формат, разделенный запятыми, например, после каждой тысячи

۱,۱۲۵,۱۲۰,۱۲۴

как когда я делаю

number_format(1125120124); // it returns as 1,125,120,124

а также

number_format(112512012); // it returns as 112,512,012

Так что на самом деле я хочу, чтобы результаты были аналогичны методу number_format. Я только начал регулярные выражения. Пробовал с очень простыми шаблонами, но все еще не близко. Попытался preg_split разбить строку и снова соединить ее запятыми, но не похоже быть правильным подходом. У меня есть функция, в которой я передаю число, которое возвращает мне это число персидскими символами. Делюсь этим тоже

function trans($num)
{
    $persian_num_array = [
    '0'=>'۰',
    '1'=>'۱',
    '2'=>'۲',
    '3'=>'۳',
    '4'=>'۴',
    '5'=>'۵',
    '6'=>'۶',
    '7'=>'۷',
    '8'=>'۸',
    '9'=>'۹',
];
    $translated_num = '';
    $temp_array=[];
    while ($num > 0) {
        array_push($temp_array,$num % 10);
        $num = intval($num / 10);
    }

    foreach($temp_array as $val){
        $translated_num.= $persian_num_array[array_pop($temp_array)];
    }
    echo $translated_num;

}

person Talha Malik    schedule 29.09.2016    source источник
comment
Итак, у вас есть $inpt = '۱۱۲۵۱۲۰۱۲۴', и вы хотите получить $output = 1,125,120,124 (в виде числа)? Или $output = "1,125,120,124"?   -  person Wiktor Stribiżew    schedule 29.09.2016
comment
Нет, у меня есть $input ='1125120124' , я меняю его на $temp_result = '۱۱۲۵۱۲۰۱۲۴', но $final_result должен быть отформатированным числом. например, «۱,۱۲۵,۱۲۰,۱۲۴»   -  person Talha Malik    schedule 29.09.2016
comment
Итак, после перевода ваших цифр на персидский язык вы можете использовать preg_replace('~\d(?=(\d{3})+(?!\d))~', '$0,', $temp).   -  person Wiktor Stribiżew    schedule 29.09.2016


Ответы (2)


Поскольку преобразование в персидский — это просто замена символов, вы можете отформатировать число с помощью встроенной функции number_format(), а затем заменить числа без замены запятых. Вот пример:

function trans($num)
{
    $persian_num_array = [
        '0'=>'۰',
        '1'=>'۱',
        '2'=>'۲',
        '3'=>'۳',
        '4'=>'۴',
        '5'=>'۵',
        '6'=>'۶',
        '7'=>'۷',
        '8'=>'۸',
        '9'=>'۹',
    ];

    $num = (float) $num;
    return strtr(number_format($num), $persian_num_array);
}

echo trans(1125120124); // returns ۱,۱۲۵,۱۲۰,۱۲۴
person Anton    schedule 29.09.2016
comment
Это хорошо, просто ввод OP - это строка, насколько я понял (из комментариев). Итак, сначала его следует привести к числу. - person Wiktor Stribiżew; 29.09.2016
comment
@Антон Это красиво. Спасибо. Есть ли что-то подобное в java script? - person Talha Malik; 29.09.2016
comment
@TalhaMalik Я думаю, что нет проблем с переносом этой функции на Javascript. Посмотрите здесь: locutus.io/php/strings/strtr/index.html locutus.io/php/strings/number_format/index.html - person Anton; 29.09.2016

Расширение PHP Intl включает в себя NumberFormatter, который может форматировать ваш номер для данной локали.

Пример:

$number = "1125120124";
$formatter = NumberFormatter::create("fa_IR", NumberFormatter::DEFAULT_STYLE);
echo $formatter->format($number);

Выход:

۱٬۱۲۵٬۱۲۰٬۱۲۴

Чтобы принудительно использовать запятую, у него есть метод setSymbol().

Пример:

$number = "1125120124";
$formatter = NumberFormatter::create("fa_IR", NumberFormatter::DEFAULT_STYLE);
$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, ",");
echo $formatter->format($number);

Выход:

۱,۱۲۵,۱۲۰,۱۲۴

Или, если вы вводили текст на персидском языке, сначала используйте для него транслитератор.

Пример:

$input = "۱۱۲۵۱۲۰۱۲۴";    
$transliterator = Transliterator::create("fa-fa_Latn/BGN");
$number = $transliterator->transliterate($input);
echo $number, "\n";

$formatter = NumberFormatter::create("fa_IR", NumberFormatter::DEFAULT_STYLE);
$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, ",");
echo $formatter->format($number);

Выход:

1125120124
۱,۱۲۵,۱۲۰,۱۲۴
person user3942918    schedule 29.09.2016
comment
Спасибо. Я проверил это, но у меня не было возможности изменить php.ini, поэтому я не пробовал. Спасибо за пример кода. - person Talha Malik; 29.09.2016