web-dev-qa-db-fra.com

convertir les nombres persan/arabe en nombres anglais

Comment puis-je convertir des nombres en persan/arabe en des nombres en anglais avec une fonction simple? 

Nombres persan/arabe:

۰   //  -> 0
۱   //  -> 1
۲   //  -> 2
۳   //  -> 3
۴   //  -> 4
۵   //  -> 5
۶   //  -> 6
۷   //  -> 7
۸   //  -> 8
۹   //  -> 9

numéros sur l'unicode: 

$num0="۰";
$num1="۱";
$num2="۲";
$num3="۳";
$num4="۴";
$num5="۵";
$num6="۶";
$num7="۷";
$num8="۸";
$num9="۹";
21
Root125

Parce que les gens de la région arabe et persane utilisent peut-être une autre langue, c'est la solution complète pour convertir les deux types.

function convert2english($string) {
    $newNumbers = range(0, 9);
    // 1. Persian HTML decimal
    $persianDecimal = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹');
    // 2. Arabic HTML decimal
    $arabicDecimal = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩');
    // 3. Arabic Numeric
    $arabic = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩');
    // 4. Persian Numeric
    $persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹');

    $string =  str_replace($persianDecimal, $newNumbers, $string);
    $string =  str_replace($arabicDecimal, $newNumbers, $string);
    $string =  str_replace($arabic, $newNumbers, $string);
    return str_replace($persian, $newNumbers, $string);
}
5
Root125

Voici une courte fonction:

function convert($string) {
    $persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
    $arabic = ['٩', '٨', '٧', '٦', '٥', '٤', '٣', '٢', '١','٠'];

    $num = range(0, 9);
    $convertedPersianNums = str_replace($persian, $num, $string);
    $englishNumbersOnly = str_replace($arabic, $num, $convertedPersianNums);

    return $englishNumbersOnly;
}

Vous pouvez utiliser le code unicode à la place des caractères de $persian (je pense).

55
Palladium

J'utilise cette fonction. Il convertit les nombres arabes et persans en anglais:

function faTOen($string) {
    return strtr($string, array('۰'=>'0', '۱'=>'1', '۲'=>'2', '۳'=>'3', '۴'=>'4', '۵'=>'5', '۶'=>'6', '۷'=>'7', '۸'=>'8', '۹'=>'9', '٠'=>'0', '١'=>'1', '٢'=>'2', '٣'=>'3', '٤'=>'4', '٥'=>'5', '٦'=>'6', '٧'=>'7', '٨'=>'8', '٩'=>'9'));
}

échantillon:

echo faTOen("۰۱۲۳۴۵۶۷۸۹٠١٢٣٤٥٦٧٨٩"); // 01234567890123456789

Aussi, vous pouvez utiliser la même méthode pour convertir l'anglais en persan:

function enToFa($string) {
    return strtr($string, array('0'=>'۰','1'=>'۱','2'=>'۲','3'=>'۳','4'=>'۴','5'=>'۵','6'=>'۶','7'=>'۷','8'=>'۸','9'=>'۹'));
}

Ou anglais vers arabe:

function enToAr($string) {
    return strtr($string, array('0'=>'٠','1'=>'١','2'=>'٢','3'=>'٣','4'=>'٤','5'=>'٥','6'=>'٦','7'=>'٧','8'=>'٨','9'=>'٩'));
}
15
Saeid Tahmuresi

c'est mieux. Nous avons deux types de chiffres en arabe et en persan. il faut tout changer.

function convert($string) {
    $persinaDigits1= array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹');
    $persinaDigits2= array('٩', '٨', '٧', '٦', '٥', '٤', '٣', '٢', '١', '٠');
    $allPersianDigits=array_merge($persinaDigits1, $persinaDigits2);
    $replaces = array('0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9');
    return str_replace($allPersianDigits, $replaces , $string);
}


merci @Palladium

Faites attention lorsque vous copiez le code! Vérifiez deux fois comment le tableau est présenté dans votre éditeur, sinon vous aurez des problèmes!

8
iman
$fmt = numfmt_create('fa', NumberFormatter::DECIMAL);
echo numfmt_parse($fmt, "۵") . "\n";
// 5
5

Pour convertir tous les nombres persans au format anglais, vous pouvez utiliser cette fonction:

function Convertnumber2english($srting) {

        $srting = str_replace('۰', '0', $srting);
        $srting = str_replace('۱', '1', $srting);
        $srting = str_replace('۲', '2', $srting);
        $srting = str_replace('۳', '3', $srting);
        $srting = str_replace('۴', '4', $srting);
        $srting = str_replace('۵', '5', $srting);
        $srting = str_replace('۶', '6', $srting);
        $srting = str_replace('۷', '7', $srting);
        $srting = str_replace('۸', '8', $srting);
        $srting = str_replace('۹', '9', $srting);

        return $srting;
    }
3

Deux fonctions utiles:

Premier numéro converti en anglais:

function convert_to_en_number($string) {
    $persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
    $arabic = ['٩', '٨', '٧', '٦', '٥', '٤', '٣', '٢', '١','٠'];

    $num = range(0, 9);
    $convertedPersianNums = str_replace($persian, $num, $string);
    $englishNumbersOnly = str_replace($arabic, $num, $convertedPersianNums);

    return $englishNumbersOnly;
}

Deuxième conversion en nombre persan:

function convert_to_fa_number($string) {
    $num = range(0, 9);
    $arabic = ['٩', '٨', '٧', '٦', '٥', '٤', '٣', '٢', '١','٠'];
    $persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];

    $convertedEnglishNums = str_replace($num, $persian, $string);
    $persianNumbersOnly = str_replace($arabic, $persian, $convertedEnglishNums);

    return $persianNumbersOnly;
}
2
Ali Motameni

Je sais que la question remonte à six ans, mais je viens de le découvrir et de mettre au point une solution générique que j'aimerais partager ici pour les futurs lecteurs.

Fondamentalement, j'utilise le NumberFormatter pour générer les nombres dans n'importe quelle langue étrangère, puis je remplace les nombres dans la chaîne d'entrée par ceux de l'anglais.

Cela devrait fonctionner pour n'importe quelle langue, mais j'ai écrit la mienne pour l'arabe.

/**
 * Replace Arabic numbers by English numbers in a string
 *
 * @param $value string A string containing Arabic numbers.
 * @param $source_language string The locale to convert chars from.
 *
 * @return string The string with Arabic numbers replaced by English numbers
 */
function englishifyNumbers ($value, $source_language = 'ar') {
    // Remove any direction overriding chars [LRO (U+202D)]
    $value = trim($value);

    // Create an Arabic number formatter to generate Arabic numbers
    $fmt = new \NumberFormatter(
        $source_language, 
        \NumberFormatter::PATTERN_DECIMAL
    );

    // Create an array of English numbers to use for replacement
    $english_numbers = range(0, 9);

    // Convert the English numbers to Arabic numbers using the formatter
    $arabic_numbers = array_map(function ($n) use ($fmt) {
        // Trim to remove direction overriding chars [PDF (U+202C)]
        return trim($fmt->format($n));

    }, $english_numbers);

    // Replace the numbers and return the result
    return str_replace($arabic_numbers, $english_numbers, $value);
}
1
iSWORD

Pas besoin de diviser la chaîne d'entrée.

private function convert($input)
{
    $unicode = array('۰', '۱', '۲', '۳', '٤', '٥', '٦', '۷', '۸', '۹');
    $english = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

    $string = str_replace($unicode, $english , $input);

    return $string;
}

Exemples

convert("۱۲۳٤٥");   //output : 12345

convert("۱۲34٥");   //output : 12345

convert("12345");   //output : 12345
0
Mohamed Elorbany

Probablement une meilleure réponse en utilisant une sorte de remplacement, mais pour le coder vous-même, ce serait mieux que ce que vous avez:

$len = strlen($arabic);
for ( $i = 0; $i < $len; ++$i )
{
    switch( $arabic[$i] )
    {
    case '&#1776':
        $english .= '0';
        break;
    case '&#1777':
        $english .= '1';
        break;
    case '&#1778':
        $english .= '2';
        break;
    // and so on
    case '&#1785':
        $english .= '9';
        break;
    default:
        $english .= $arabic[$i];
    }
}

Ça devrait le faire.

0
KRyan

que diriez-vous quelque chose comme ça...

$number = arbic_to_english("&#1777;&#1779;");

echo $number; // 13

function arbic_to_english($number) {
    $english_number = 0;
    $matches = array();
    preg_match_all('/&#\d{4};/', $number, $matches);
    if(!count($matches) || !count($matches[0])) {
        throw new Exception('Invalid number');
    }
    $power = count($matches[0]) - 1;
    foreach($matches[0] as $arbic_digit) {
        $english_digit = preg_replace('/&#\d{2}(\d{2});/', '$1', $arbic_digit) - 76;
        $english_number += $english_digit * pow(10, $power--);
    }
    return $english_number;
}
0
hackattack