如何使用简单的函数将波斯/阿拉伯数字转换为英语数字?
波斯/阿拉伯数字:
۰ // -> 0
۱ // -> 1
۲ // -> 2
۳ // -> 3
۴ // -> 4
۵ // -> 5
۶ // -> 6
۷ // -> 7
۸ // -> 8
۹ // -> 9
unicode 上的数字:
$num0="۰";
$num1="۱";
$num2="۲";
$num3="۳";
$num4="۴";
$num5="۵";
$num6="۶";
$num7="۷";
$num8="۸";
$num9="۹";
这是一个简短的函数:
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
中的字符(我认为)。
我就用这个功能。它将波斯语和阿拉伯数字转换为英语:
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'=>'٩'));
}
因为波斯语和阿拉伯语地区的人们可能会使用彼此的键盘类型,所以这是转换这两种类型的完整解决方案。
基于@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);
}
这样更好。 我们有阿拉伯语和波斯语两种数字。我们必须改变一切。
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
复制代码时要小心!检查两次数组在编辑器中的显示方式,否则您将遇到麻烦!
$fmt = numfmt_create('fa', NumberFormatter::DECIMAL);
echo numfmt_parse($fmt, "۵") . "\n";
// 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;
}
两个有用的功能:
先转换成英文数字:
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;
}
使用以下函数将阿拉伯数字转换为英文数字数字的非常简单的方法:
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
我知道这是一个六年前的问题,但我刚刚遇到这个问题并开发了一个通用解决方案,我想在这里与未来的读者分享。
基本上,我使用 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);
}
$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);
使用某种替换可能是更好的答案,但对于自己编码,这会比你所拥有的更好:
$len = strlen($arabic);
for ( $i = 0; $i < $len; ++$i )
{
switch( $arabic[$i] )
{
case '۰':
$english .= '0';
break;
case '۱':
$english .= '1';
break;
case '۲':
$english .= '2';
break;
// and so on
case '۹':
$english .= '9';
break;
default:
$english .= $arabic[$i];
}
}
应该可以了。
这样的事情怎么样...
$number = arbic_to_english("۱۳");
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;
}
无需分割输入字符串。
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
最好的方法是使用 NumberFormatter:
$formatter = \NumberFormatter::create('en', \NumberFormatter::DECIMAL);
echo $formatter->parse('۱۳۹۹'); // outputs: 1399
这是一个函数,它接受一个字符串和源语言的零以及目标语言的零
在下面的示例中,我将给定字符串的数字从印地语转换为拉丁语
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('')
}
我用过这个功能
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;
}
基于@Root 的回答:
function to_english_number( $string ) {
$persianDecimal = [ '۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹' ];
$arabicDecimal = [ '٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩' ];
$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;
}
private function convertArabicInput($input)
{
$translationMap = [
'٠' => '0',
'١' => '1',
'٢' => '2',
'٣' => '3',
'٤' => '4',
'٥' => '5',
'٦' => '6',
'٧' => '7',
'٨' => '8',
'٩' => '9',
];
return strtr($input, $translationMap);
}