将字符串转换为波斯数字格式
convert a string to persian number format
例如我有一个波斯数字字符串
۱۱۲۵۱۲۰۱۲۴
即英文数字1125120124。我想将此字符串转换为每千后以逗号分隔的数字格式,例如
۱,۱۲۵,۱۲۰,۱۲۴
就像我做的那样
number_format(1125120124); // it returns as 1,125,120,124
和
number_format(112512012); // it returns as 112,512,012
所以实际上我想要与 number_format 方法类似的结果。我刚开始使用正则表达式。尝试了非常基本的模式,但仍然没有接近。尝试 preg_split 拆分字符串并再次用逗号连接它,但似乎不是正确的方法。我有一个函数,我传递一个数字 returns 我用波斯语字符表示的那个数字。也分享一下
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;
}
由于转换为波斯语只是字符替换,您可以使用内置 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 ۱,۱۲۵,۱۲۰,۱۲۴
PHP 的 Intl extension includes a NumberFormatter class 可以针对给定的语言环境格式化您的号码。
示例:
$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);
输出:
۱,۱۲۵,۱۲۰,۱۲۴
或者,如果您输入的是波斯语,请先使用 Transliterator。
示例:
$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
۱,۱۲۵,۱۲۰,۱۲۴
例如我有一个波斯数字字符串
۱۱۲۵۱۲۰۱۲۴
即英文数字1125120124。我想将此字符串转换为每千后以逗号分隔的数字格式,例如
۱,۱۲۵,۱۲۰,۱۲۴
就像我做的那样
number_format(1125120124); // it returns as 1,125,120,124
和
number_format(112512012); // it returns as 112,512,012
所以实际上我想要与 number_format 方法类似的结果。我刚开始使用正则表达式。尝试了非常基本的模式,但仍然没有接近。尝试 preg_split 拆分字符串并再次用逗号连接它,但似乎不是正确的方法。我有一个函数,我传递一个数字 returns 我用波斯语字符表示的那个数字。也分享一下
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;
}
由于转换为波斯语只是字符替换,您可以使用内置 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 ۱,۱۲۵,۱۲۰,۱۲۴
PHP 的 Intl extension includes a NumberFormatter class 可以针对给定的语言环境格式化您的号码。
示例:
$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);
输出:
۱,۱۲۵,۱۲۰,۱۲۴
或者,如果您输入的是波斯语,请先使用 Transliterator。
示例:
$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
۱,۱۲۵,۱۲۰,۱۲۴