56

如何使用简单的函数 将波斯/阿拉伯数字转换为英文数字?

波斯/阿拉伯数字:

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

unicode 上的数字:

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

17 回答 17

97

这是一个简短的功能:

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

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

    return $englishNumbersOnly;
}

您可以使用 unicode 代替$persian(我认为)中的字符。

于 2012-08-01T20:20:56.637 回答
32

我使用这个功能。它将波斯语和阿拉伯语数字转换为英语:

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'));
}

样本:

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

您也可以用同样的方式将英语转换为波斯语:

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

或英语到阿拉伯语:

function enToAr($string) {
    return strtr($string, array('0'=>'٠','1'=>'١','2'=>'٢','3'=>'٣','4'=>'٤','5'=>'٥','6'=>'٦','7'=>'٧','8'=>'٨','9'=>'٩'));
}
于 2016-08-21T16:51:31.193 回答
20

因为波斯语和阿拉伯语地区的人们可能会使用其他键盘类型,所以这是转换两种类型的完整解决方案。

基于@palladium 的回答。

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);
}
于 2017-09-23T06:08:15.190 回答
12

这个更好。我们有两种阿拉伯文和波斯文数字。我们必须改变一切。

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);
}


谢谢@Palladium

复制代码时要小心!检查两次数组在编辑器中的显示方式,否则您将遇到麻烦!

于 2014-03-07T14:31:50.137 回答
8
$fmt = numfmt_create('fa', NumberFormatter::DECIMAL);
echo numfmt_parse($fmt, "۵") . "\n";
// 5
于 2012-08-01T20:11:38.170 回答
5

要将所有波斯数字转换为英文格式,您可以使用此功能:

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;
    }
于 2014-01-06T14:16:11.520 回答
3

两个有用的功能:

先转换成英文数字:

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;
}

第二次转换为波斯数字:

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;
}
于 2018-05-24T09:48:29.057 回答
3

使用以下函数将阿拉伯数字转换为英文数字的非常简单的方法:

function ArtoEnNumeric($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'));
}

echo ArtoEnNumeric('۶۰۶۳١۶۳٨'); 
Output = 60631638
于 2019-06-24T13:34:55.270 回答
1

我知道这是一个已有六年历史的问题,但我只是遇到了这个问题并开发了一个通用的解决方案,我想在这里分享给未来的读者。

基本上,我使用NumberFormatter生成任何外语的数字,然后将输入字符串中的数字替换为英语中的数字。

它应该适用于任何语言,但我是用阿拉伯语写的。

/**
 * 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);
}
于 2018-07-18T17:31:12.107 回答
1
$sting= '٩٨٥٤٠٣٧٦٣٢١'; 

// search stings
$seachstrings = array("١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"); 

// replace strings 
$replacestrings= array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0"); 

// replace function 
$result= str_replace($seachstrings , $replacestrings, $sting); 

print_r($result); 
于 2019-08-04T11:28:12.697 回答
0

使用某种替换可能是一个更好的答案,但是对于自己编码,这会比你拥有的更好:

$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];
    }
}

那应该这样做。

于 2012-08-01T20:16:58.450 回答
0

像这样的东西怎么样...

$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;
}
于 2012-08-01T20:17:06.970 回答
0

无需分割输入字符串。

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;
}

例子

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

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

convert("12345");   //output : 12345
于 2016-06-13T08:51:50.053 回答
0

最好的方法是使用NumberFormatter

$formatter = \NumberFormatter::create('en', \NumberFormatter::DECIMAL);
echo $formatter->parse('۱۳۹۹'); // outputs: 1399
于 2020-03-27T17:39:28.357 回答
0

这是一个函数,它接受一个字符串和零的源语言和零的目标语言

在下面的示例中,我将给定字符串的数字从印地语转换为拉丁语

val = LangNum2Num("जिनसे आप कुछ ९० सीख सकते ३४ हैं हम लाये हैं ७ आपके लिये कुछ", "०", 0)
console.log(val)
// Prints जिनसे आप कुछ 90 सीख सकते 34 हैं हम लाये हैं 7 आपके लिये कुछ




// Coverts numbers insides a string to other language number
// str is the string
// zeroFrom is the zero number from the language you want to convert
// zeroTo is the zero number of the languague you want to convert to

function LangNum2Num(str, zeroFrom, zeroTo) {
  // Get the UTF-16 code points of zeros
  codezeroFrom = ("" + zeroFrom).codePointAt(0)
  codezeroTo = ("" + zeroTo).codePointAt(0)

  // Make array containing codepoints from 0 to 10 for the language
  var FromArr = [...Array(10).keys()].map(e => codezeroFrom + e)
  var ToArr = [...Array(10).keys()].map(e => codezeroTo + e)

  // Split the string into array, if we catch a number, we will return number from destination language
  return str.split('').map(e => FromArr.includes(e.codePointAt(0)) ? String.fromCodePoint(ToArr[FromArr.indexOf(e.codePointAt(0))]) : e).join('')

}

于 2020-09-18T23:47:16.547 回答
0

我使用了这个功能

function toEngNumbers($string)
{
    $arabic = ['٩', '٨', '٧', '٦', '٥', '٤', '٣', '٢', '١', '٠'];
    $persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
    $english = ['9', '8', '7', '6', '5', '4', '3', '2', '1', '0'];

    $convertedPersianNums = str_replace($persian, $english, $string);
    $converted = str_replace($arabic, $english, $convertedPersianNums);
    return $converted;
}
于 2021-03-30T17:32:23.433 回答
0

基于@Root 答案:

function to_english_number( $string ) {

    $persianDecimal = [ '&#1776;', '&#1777;', '&#1778;', '&#1779;', '&#1780;', '&#1781;', '&#1782;', '&#1783;', '&#1784;', '&#1785;' ];
    $arabicDecimal  = [ '&#1632;', '&#1633;', '&#1634;', '&#1635;', '&#1636;', '&#1637;', '&#1638;', '&#1639;', '&#1640;', '&#1641;' ];

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

    $num = range( 0, 9 );

    $string = str_replace( $persianDecimal, $num, $string );
    $string = str_replace( $arabicDecimal, $num, $string );

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

    return $string;
}
于 2021-05-14T16:12:29.347 回答