当前位置: 首页 > news >正文

阿拉伯数字转中文数字表示[PHP]

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在一些时候需要用中文来显示顺序更加合适,最显著的就是书的章节,第一章,第二章,第三章 ...第二百零三章;

转换不是很麻烦,但一些问题是不可忽视的

  1. 110 应该为一百一十,这没问题,但11就不能是一十一;
  2. 10010 -> 一万零一十;
  3. 100000000 -> 一亿 ,不能是 一亿万;

先上基础数据


static public $_chapterIndexes = array('零','一','二','三','四','五','六','七','八','九','十','百','千','万','亿');

这里虽然后面的万,亿写在一起,但逻辑中还是会被切分开;

我这里选择将数字转为字符串切为数组,这样会比较简单一点;

/**
 * 转换数字为中文数字
 * @param type $index
 * @return type
 * @author xilei
 */
static public function chapterIndex($index){
   $result = array();
   $nums = str_split(strval($index), 1);
   krsort($nums,SORT_NUMERIC);
   $i = 0; $lastv = -1; $mi = 1;$gi = 0;
   $maxIndexes = array();
   foreach($nums as $v){
        if($gi==4 * $mi){
          //添加 万,亿
          $end = end($result);
          if(empty($maxIndexes))
             $maxIndexes = array_slice(self::$_chapterIndexes,13);
          if(in_array($end, $maxIndexes)){
             array_pop($result);
          }
          $result[] = $maxIndexes[$mi-1]; 
          $i=0;$mi++;
        }
        if($i!=0 && $v!=0){
            $result[] = self::$_chapterIndexes[9+$i];
        }
        if($lastv!=0 || $v!=0){
            $result[] = self::$_chapterIndexes[$v];
        }
        $i++;$lastv = $v;$gi++;
   }
  krsort($result,SORT_NUMERIC);
  $count = count($result);
  //十零 => 十
  if($count!=1 && $result[0] == self::$_chapterIndexes[0]){
       array_pop($result);
  }
  //一十 => 十
  if($index>=10 && $index<100 
        && $result[$count-1] == self::$_chapterIndexes[1]){
       array_shift($result);
  }
  return implode($result);
}

在第一个if中是添加 万和 亿,但要避免出现之前说的万亿问题,所以要检查最后一个是否为这些单位中的一个,并移除;

第二个if就是添加十,百,千,

第三个if就是转换普通的数字0~9,但有一点要注意就是上一次的值和当前值不能同时为0,避免出现 "零零"的状况;

最后两个判断是我在foreach无法过滤的;

第一个是 对零零问题的最后一步检查,因为按照这样的逻辑,只要出现了"零零"的情况就肯定有一个零已经放进去了,

但这也是我们需要的,唯一就是不能出现在最后一位上;

第二个是 "一十"问题,由于十的特殊性在一十时会省略一;

理论上可以支持到万亿数字;

转载于:https://my.oschina.net/empty125/blog/281096

相关文章:

  • oral_quiz-#扑克牌是不是顺子#
  • Android使用百度地图的注意点
  • 移动互联网金融的全方位服务时代已经到来
  • 再读《精通css》03:引入和注释
  • 长假结束了
  • saltstack(九)returner
  • jdbc ResultSet 处理工具类DbUtil
  • 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆
  • web app开发——使用jQuery Mobile创建餐厅订餐应用
  • Python 格式符大聚会之​%r
  • 电压放大和电流放大区分
  • 未来地图,开启万物互联-华中雄
  • 搭建Struts框架
  • Windows下Lisp环境配置
  • 定时休息护眼神器(EyeDefender)护眼大法
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • CAP理论的例子讲解
  • ECS应用管理最佳实践
  • ES6--对象的扩展
  • js数组之filter
  • Linux CTF 逆向入门
  • SSH 免密登录
  • 阿里云Kubernetes容器服务上体验Knative
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 入手阿里云新服务器的部署NODE
  • C# - 为值类型重定义相等性
  • 阿里云API、SDK和CLI应用实践方案
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (9)目标检测_SSD的原理
  • (a /b)*c的值
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (分类)KNN算法- 参数调优
  • (转)VC++中ondraw在什么时候调用的
  • (转)树状数组
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 使窗口永不获得焦点
  • .net对接阿里云CSB服务
  • .net快速开发框架源码分享
  • @Bean有哪些属性
  • [C++]:for循环for(int num : nums)
  • [C++基础]-初识模板
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [cocos2d-x]关于CC_CALLBACK
  • [codeforces]Levko and Permutation
  • [CQOI 2010]扑克牌
  • [iOS]iOS获取设备信息经常用法
  • [Linux]使用CentOS镜像与rpm来安装虚拟机软件
  • [RQNOJ 696] 【树形DP】
  • [SOA介绍]什么是SOA?