Rumah >pembangunan bahagian belakang >masalah PHP >Bagaimana untuk menukar nombor php kepada aksara Cina

Bagaimana untuk menukar nombor php kepada aksara Cina

PHPz
PHPzasal
2023-04-18 09:47:261713semak imbas

Apabila membangunkan sistem digital, menukar nombor kepada aksara Cina adalah keperluan yang tidak dapat dielakkan Contohnya, dalam sistem kewangan, menukar jumlah berangka kepada aksara Cina dengan mudah dan jelas. Sebagai bahasa pembangunan web yang popular, perpustakaan dan sambungan fungsi terbina dalam PHP membolehkannya menangani permintaan ini.

Artikel ini akan memperkenalkan pembaca kepada pelaksanaan menukar nilai berangka ke dalam aksara Cina, termasuk beberapa algoritma biasa dan pustaka fungsi. Saya harap ia dapat membantu pembangun merealisasikan fungsi menukar nombor kepada aksara Cina dalam projek mereka sendiri.

1. Algoritma penukaran berangka asas untuk aksara Cina

Kaedah paling asas ialah membahagikan nombor kepada kumpulan empat nombor mengikut urutan dari kiri, dan unit maksimum kumpulan ialah sepuluh ribu atau bilion tahap. Nilai berangka dalam setiap kumpulan ditukar kepada ungkapan aksara Cina yang sepadan melalui algoritma, dan kemudian aksara Cina bagi nombor ini boleh disambungkan bersama. Oleh itu, pertama sekali kita perlu mentakrifkan hubungan antara nombor dan aksara Cina:

Nombor 0~9: sifar, satu, dua, tiga, empat, lima, enam, tujuh, lapan, sembilan
Nombor 10 ~19 : Sepuluh, sebelas, dua belas,..., lapan belas, sembilan belas
Nombor 20~90 (saiz langkah ialah 10): Dua puluh, tiga puluh,..., lapan puluh, sembilan puluh
Nombor 100 : Seratus
Nombor 1000: Seribu
Nombor 10000: Sepuluh ribu
Nombor 100000000: Seratus juta

Kemudian, kumpulkan nilai yang ingin anda tukar (unit maksimum boleh dilaraskan mengikut keperluan ) , nilai dalam setiap kumpulan ditukar mengikut peraturan berikut:

  1. Jika nombor ialah 0, keluarkan terus "sifar"
  2. Jika nombor lebih besar daripada atau sama dengan 10, tetapi kurang daripada 20, ikut Output dalam format "puluhan" (seperti "sebelas", "dua belas"..."sembilan belas")
  3. Jika nombor lebih besar daripada atau sama dengan 20, ia ditukar kepada output format "十X" (seperti "dua" "Sepuluh", "Tiga Puluh"..."Sembilan Puluh")
  4. Jika nombor lebih besar daripada atau sama dengan 100 , tukarkannya kepada format "X ratus" dan keluarkan, dan proses nilai secara rekursif di bawah tempat keseratus
  5. Jika nombor lebih besar daripada atau sama dengan 1000, tukarkannya kepada format "X ribu" dan keluarkannya, dan proses secara rekursif nilai di bawah tempat ke-seribu
  6. Jika nombor itu lebih besar daripada atau sama dengan 10000, tukarkannya kepada format "X ribu" dan keluarkannya, dan empat digit terakhir diproses secara rekursif
  7. Jika nombor lebih besar daripada atau sama dengan 100000000, ia ditukar kepada format "X bilion" dan output, dan lapan digit terakhir diproses secara rekursif

Algoritma adalah seperti berikut:

fungsi num2chn($num) {

$chnnum = '';
$unit = array('','十','百','千','万','十','百','千','亿','十','百','千','兆');
$datacn = array('零','一','二','三','四','五','六','七','八','九');
$sign = $num < 0 ? &#39;负&#39; : &#39;&#39;;
$num = abs($num);
$numstr = strval($num);      
$alen = strlen($numstr);
$pos = $alen - 1;
$lastunit = true;
for ($i = 0; $i < $alen; $i++) {
    $curidx = intval($numstr[$i]);
    $curunit = $unit[$pos];
    if ($curidx > 0) {
        $chnnum .= $datacn[$curidx] . $curunit;
        $lastunit = true;
    } 
    else if (!$lastunit) {
        $chnnum .= $datacn[$curidx];
        $lastunit = true;
    }
    if ($pos == 4 && ($lastunit || $curidx)) {
        $chnnum .= '万';
    } 
    else if ($pos == 8 && ($lastunit || $curidx)) {
        $chnnum .= '亿';
    }
    $pos--;
}
if (!$chnnum) {
    $chnnum .= '零';
}
$chnnum = $sign . $chnnum;
return $chnnum;

}

Algoritma ini mengguna pakai idea kumpulan dan langkah -penukaran mengikut langkah, dan memproses setiap bit mengikut urutan mengikut bilangan digit dalam nilai Nombor ditukar kepada aksara Cina. Perlu diingatkan bahawa pengendalian sifar memerlukan pemprosesan khas, dan output dipastikan pada akhirnya.

2. Penukaran antara nilai berangka lain dan aksara Cina

Dalam PHP, anda juga mungkin perlu menukar nilai berangka seperti jumlah kepada ungkapan aksara Cina piawai, seperti "Sepuluh ribu, tiga ratus dua "Sepuluh Yuan", atau tukar jumlah Cina kepada perwakilan berangka. Di sini kami memperkenalkan skema penukaran yang agak lengkap antara nilai berangka dan aksara Cina.

(1) Tukar nilai berangka ke dalam ungkapan aksara Cina

Algoritma ini menukar nilai berangka ke dalam aksara Cina melalui pengulangan gelung, yang boleh digunakan untuk mewakili jumlah dalam huruf besar Cina. Ia membahagikan nilai kepada bahagian integer dan bahagian perpuluhan Bahagian integer menggunakan logik yang serupa dengan yang dalam algoritma asas, dan bahagian perpuluhan ditukar dari kiri ke kanan untuk setiap digit.

function numtochn($num) {

$chncharacters = array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
$chnunits = array("", "拾", "佰", "仟", "万", "亿");
$level = array("", "万", "亿");
list($numInteger, $numDecimal) = explode(".", $num);
$integerStr = strrev($numInteger);   
$len = strlen($integerStr);        
$dwNum = 0;                         
$numAnsStr = sprintf("%s整", $level[0]); 

for ($i = 0;$i < $len; $i++) {     
    $tmpStr = &#39;&#39;;
    $perChar = substr($integerStr, $i, 1);
    $perInt = intval($perChar);
    if ($perInt == 0) {
        if ($i % 4 == 0) {
            $dwNum ++;
        }
        if ($dwNum > 0 && $dwNum % 2 == 0) {
            $tmpStr = $level[$dwNum / 2];
        }
        if ($i == $len - 1 || $i % 4 == 3) {
            $tmpStr .= $chnunits[4 + (($i + 1) % 4)];
            $dwNum = 0;
        }
        $numAnsStr = $tmpStr . $numAnsStr;
        continue;
    }
    $tmpStr = $chncharacters[$perInt];
    $tmpStr .= $chnunits[$i % 4]; 
    if ($i % 4 == 3) {
        $tmpStr .= $level[$dwNum / 2];
        $dwNum = 0;
    }
    $numAnsStr = $tmpStr . $numAnsStr;  
}

$numAnsStr = str_replace("零拾", "零", $numAnsStr);        
$numAnsStr = str_replace("零佰", "零", $numAnsStr);         
$numAnsStr = str_replace("零仟", "零", $numAnsStr);     
$numAnsStr = str_replace("零万", "万", $numAnsStr); 
$numAnsStr = str_replace("零亿", "亿", $numAnsStr);         
while (strpos($numAnsStr, "零零") !== false) {
    $numAnsStr = str_replace("零零", "零", $numAnsStr);
}
$numAnsStr = str_replace("亿万", "亿", $numAnsStr);        
if ($numDecimal != '') {  
    $decimalStr = '';
    for ($i = 0; $i < strlen($numDecimal); $i++) {
        $decimalStr .= $chncharacters[intval(substr($numDecimal, $i, 1))].$chnunits[$i+1];
    }
    $numAnsStr .= str_replace("零零", "零", $decimalStr);
}
return $numAnsStr;

}

(2) Tukar ungkapan aksara Cina kepada nilai berangka

Anda boleh menggunakan ungkapan biasa untuk melaksanakan aksara Cina Untuk penukaran jumlah, aksara Cina ditukar kepada nombor yang sepadan sedikit demi sedikit dan terkumpul Jika "sepuluh ribu" atau "ratus juta" ditemui, hasil terkumpul didarabkan dengan faktor pembawa yang sepadan.

function chntoNum($str) {

$dict = array(&#39;零&#39;=>0,'壹'=>1,'贰'=>2,'叁'=>3,'肆'=>4,'伍'=>5,'陆'=>6,'柒'=>7,'捌'=>8,'玖'=>9,'一'=>1,'二'=>2,'三'=>3,'四'=>4,'五'=>5,'六'=>6,'七'=>7,'八'=>8,'九'=>9,'十'=>10,'百'=>100,'千'=>1000,'万'=>10000,'亿'=>100000000,'元'=>1,'角'=>0.1,'分'=>0.01);
preg_match_all("/[一二三四五六七八九十百千万亿角分]/u", $str, $match);
$match = $match[0];
$result=0;
$temp=1;
foreach($match as $value){
    $num=$dict[$value];
    if($num==100000000||$num==10000){
        $result+=$temp*$num;
        $temp=1;
    }else if($num>=10&&$num<100){
        $temp*= $num;
    }else if($num<10){
        $temp*= 10;
        $result +=$temp*$num;
        $temp = 1;
    }
}
if($temp!=1){
    $result += $temp;
}
return sprintf("%.2f", $result);

}

Dengan cara ini, kita boleh melaksanakan jumlah berangka dengan mudah dalam projek kita sendiri dengan memanggil fungsi ini Penukaran antara bahasa Cina watak.

Atas ialah kandungan terperinci Bagaimana untuk menukar nombor php kepada aksara Cina. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn