【问题标题】:convert a string to persian number format将字符串转换为波斯数字格式
【发布时间】:2017-02-07 08:06:15
【问题描述】:

例如,我有一个波斯数字字符串

11251220122

即英文数字1125120124。例如,我想将此字符串转换为以逗号分隔的数字格式,例如

1,125,120,124

喜欢我做的时候

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;

}

【问题讨论】:

  • 那么,您拥有$inpt = '۱۱۲۵۱۲۰۱۲۴',并且想要获得$output = 1,125,120,124(作为数字)?还是$output = "1,125,120,124"
  • 不,我有 $input ='1125120124' ,我将其更改为 $temp_result = '۱۱2۵۱۲۰۱۲۴' 但 $final_result 应该是一个格式化的数字。比如'1,125,120,124'
  • 好的,把你的数字翻译成波斯语后,你可以使用preg_replace('~\d(?=(\d{3})+(?!\d))~', '$0,', $temp)

标签: php regex string number-formatting


【解决方案1】:

由于转换为波斯语只是字符替换,您可以使用内置 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 ۱,۱۲۵,۱۲۰,۱۲۴

【讨论】:

【解决方案2】:

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

输出:

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

或者,如果您的输入是波斯语,请先在其上使用 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
۱,۱۲۵,۱۲۰,۱۲۴

【讨论】:

  • 谢谢。我检查了,但我没有更改 php.ini 的选项,所以没有尝试。感谢您提供示例代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多