Maison  >  Article  >  développement back-end  >  Comment convertir des nombres php en caractères chinois

Comment convertir des nombres php en caractères chinois

PHPz
PHPzoriginal
2023-04-18 09:47:261669parcourir

Lors du développement d'un système numérique, la conversion des nombres en caractères chinois est une nécessité inévitable. Par exemple, dans le système financier, la conversion de montants numériques en caractères majuscules chinois peut exprimer facilement et clairement le montant. En tant que langage de développement Web populaire, les bibliothèques de fonctions et extensions intégrées de PHP lui permettent de répondre à cette demande.

Cet article présentera aux lecteurs la mise en œuvre de la conversion de valeurs numériques en caractères chinois, y compris certains algorithmes et bibliothèques de fonctions courants. J'espère que cela pourra aider les développeurs à réaliser la fonction de conversion des nombres en caractères chinois dans leurs propres projets.

1. Algorithme de conversion numérique de base pour les caractères chinois

La méthode la plus élémentaire consiste à diviser les nombres en groupes de quatre nombres en séquence à partir du côté gauche du nombre, et l'unité de regroupement maximale est de dix mille ou milliards de niveaux. Les valeurs numériques de chaque groupe sont converties en expressions de caractères chinois correspondantes via un algorithme, puis les caractères chinois de ces nombres peuvent être assemblés. Par conséquent, nous devons d'abord définir la relation entre les nombres et les caractères chinois :

Nombres 0~9 : zéro, un, deux, trois, quatre, cinq, six, sept, huit, neuf
Nombres 10~19 : dix, onze , Douze,..., dix-huit, dix-neuf
Nombres 20~90 (la taille du pas est de 10) : vingt, trente,..., quatre-vingts, quatre-vingt-dix
Nombre 100 : cent
Nombre 1000 : mille
Nombre 10000 : dix mille
Nombre 100000000 : cent millions

Ensuite, regroupez les valeurs que vous souhaitez convertir (l'unité maximale peut être ajustée selon les besoins), et convertissez les valeurs de chaque groupe selon les règles suivantes :

  1. Si le nombre est 0, affichez directement "zéro"
  2. Si le nombre est supérieur ou égal à 10, mais inférieur à 20, affichez-le au format "dizaines" (comme "onze", "douze".. ."dix-neuf")
  3. Si le nombre est supérieur à égal à 20, convertissez-le au format "dix valeurs inférieures à des centaines sont traitées de manière récursive
  4. Si le nombre est supérieur ou égal à 1000, il est converti en le format de "X mille" et de sortie, et les valeurs inférieures à des milliers sont traitées de manière récursive
  5. Si le nombre est supérieur ou égal à 10000, il est converti au format de "X mille" de sortie, et traite les quatre derniers chiffres de manière récursive
  6. Si le nombre est supérieur ou égal à 100000000, convertissez-le au format de " {
  7. $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;
  8. }
Cet algorithme adopte l'idée de regroupement et de conversion étape par étape, en traitant chaque chiffre dans tournez en fonction du nombre de chiffres de la valeur et convertissez le nombre en représentation en caractères chinois. Il est à noter que la gestion des zéros nécessite un traitement particulier, et que le rendu est assuré à la fin.

2. Conversion entre d'autres valeurs numériques et caractères chinois

En PHP, vous devrez peut-être également convertir des valeurs numériques telles que des montants en expressions de caractères chinois standardisés, telles que "dix mille trois cent vingt". yuan", ou convertir les caractères chinois en caractères chinois. Les montants sont convertis en représentation numérique. Nous introduisons ici un schéma de conversion relativement complet entre les valeurs numériques et les caractères chinois.

(1) Convertir des valeurs numériques en expressions de caractères chinois

Cet algorithme convertit les valeurs numériques en caractères chinois par récursivité de boucle, qui peut être utilisée pour représenter des montants en majuscules chinoises. Il divise la valeur en une partie entière et une partie décimale. La partie entière adopte une logique similaire à celle de l'algorithme de base, et la partie décimale est convertie de gauche à droite pour chaque chiffre.

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) Convertir les expressions de caractères chinois en valeurs numériques

Vous pouvez utiliser des expressions régulières pour convertir des montants de caractères chinois, convertir des caractères chinois en nombres correspondants petit à petit et accumuler Si "10 000" ou "100 millions" est rencontré, le résultat accumulé sera multiplié par le facteur de report correspondant.

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

De cette façon, nous pouvons facilement convertir entre les nombres et les caractères chinois dans nos propres projets en appelant ces fonctions.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn