#!/usr/bin/python

# -*- coding: utf-8 -*-

'''

脚本功能:阿拉伯数字与中文数字转换

输入参数:阿拉伯数字,不带符号

初次编写日期:2018-07-24

说明:根据《算法的乐趣》提供的算法

中文数字的权位和小节

中文数字的特点之一就是每个计数数字都跟着一个权位,这个权位就是数字的量值,相当于阿拉伯数字中的数位。最低位(个位)没有权位,也可以理解为权位为空

中文数字的另一个特点是以“万”为小节(欧美习惯以“千”为小节),每一个小节都有一个节权位,万以下的没有节权位(或节权位为空),万以上的就是万,再大的就是“亿”,每个小节内部都以“十百千”为权位的独立计数。“十百千”这几个权位是不能连续出现的,如二十百,一千千,但万和亿作为节权位却可以和其他权位一起使用,如二十亿等

中文数字的零

中文对零的使用总结有以下三条:

规则1:以10000为小节,小节的结尾即使是0,也不使用“零”。

规则2:小节内两个非0数字之间要使用“零”。

规则3:当小节的“千”为是0是,若本小节的前一小节无其他数字,则不用“零”,否则用“零”。

这里蕴含的算法设计模式 我觉得有 分治法 动态规划(状态位)

'''

import os

import sys

import logging

import math

#首先定义对照关系元组

#CHN_NUM_CHAR_COUNT = 10

#单个数字对应的中文汉字

chnNumChar = ("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")

#小节位,对32位正数表达的最大整数来说,最大节权万亿就够了

chnUnitSetion = ("", "万", "亿", "万亿")

#每个小节里面的独立计数

chnUnitChar = ("", "拾", "佰", "仟")

def NumberToChinese(num):

#取每个小节内数据然后节内处理

#先定义小节的位置,从最低一级的小节开始转换

unitPos=0

#定义规则3需不需要补零的状态位,初始默认是不需要补零

needZero=False

#初始字符串

chnStr=""

while num > 0 :

strIns=""

section=num % 10000

logging.debug( "Now:num: "+str(num) +"section:"+str(section))

if needZero:

#满足规则3需要添零,根据后面的语句是否修改了needZero来检测是否添加0

chnStr=chnNumChar[0]+chnStr

logging.debug( "Now:chnStr:"+chnStr)

#节点内处理

strIns=SectionToChinese(section)

#检测当前section的的是否是0,如果是0的话,说明前面没有小节了,已处理完,添加空字符串的节权位就可以

#否则说明还有小节,需要增加相应层级的节权位

strIns=strIns+(chnUnitSetion[unitPos] if section != 0 else chnUnitSetion[0])

#strIns += (section != 0) ? chnUnitSetion[unitPos] : chnUnitSetion[0]

chnStr=strIns+chnStr

#当满足小节内的值小于1000且值大于0的时候表示当前小节的千位是一个0,如果前面一小节还有值的时候则添0

needZero = section < 1000 and section > 0

num =num/10000

unitPos=unitPos+1

logging.debug( "Now:chnStr:"+chnStr)

return chnStr

def SectionToChinese(section):

#小节内转换,当前小节内的当前个数的独立计数的权位

strIns=""

chnStr=""

unitPos = 0

#先设置zero为true,为了规则二,两个相连的0只留一个

zero = True

while section > 0:

v=section % 10

if v==0:

#当不是两个0相连的时候或者 添加0在数字中

if not zero :

#当出现一个0的时候就设置zero为true,当下一个还是0的时候就不添加0了

zero = True

chnStr=chnNumChar[v]+chnStr

else:

#当出现一个不是0的数字的时候就设置当前的zero标志为false表示下次遇到0的时候还是要添加

zero = False

strIns = chnNumChar[v]

strIns += chnUnitChar[unitPos]

#将这个strIns插入到总的字符串的开始的位置

chnStr=strIns+chnStr

#权位增加

unitPos=unitPos+1

#小节值除以10

section /= 10 #python2

#section=math.trunc(section/10)

return chnStr

#主处理方法

def main(num):

chnStr=""

if num == 0 :

chnStr="零"

else:

chnStr=NumberToChinese(num)

logging.info( "result:"+chnStr)

if __name__ == '__main__':

#设置环境编码

reload(sys)

sys.setdefaultencoding('utf8')

#data = int(sys.argv[1])

#初始化日志配置

LOG_FORMAT = "%(asctime)s[%(levelname)s]%(message)s"

DATE_FORMAT = '%Y-%m-%d %H:%M:%S'

logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT)

logging.info( "Beginning transfor. ")

#修改这个数字

main(230221032010)

#main(data)

logging.info( "transfor over. ")

python数字转中文_阿拉伯数字转换为中文数字的python实现相关推荐

  1. Python:阿拉伯数字转换为中文大写数字(金额的读数规则)

    萌萌帮班里同学做了一个python的编程作业,正好回顾一下python基础知识,以下源码和思考过程,代码全部原创. IDE:pycharm python版本:python3.7 ''' 实验目的:在银 ...

  2. 将阿拉伯数字转换为中文大写数字 —— pyhton实现

    将阿拉伯数字转换为中文大写数字 -- pyhton实现 在银行的日常业务中,常常需要用到将阿拉伯数字转换为中文大写数字的 功能.这次实验将编写一个程序,将用户输入的阿拉伯数字代表的金额,转换为大写数字 ...

  3. 将阿拉伯数字转换为中文数字: 123 -> 一二三

    //将阿拉伯数字转换为中文数字: 123 -> 一二三String getCNNum(int srcNum) {/*** 汉字*/String[] CN_CHARS = new String[] ...

  4. VB 阿拉伯数字转换为中文大写数值函数

    Private Function CChinese(StrEng As String) As String If Not IsNumeric(StrEng) Or StrEng Like " ...

  5. Python 阿拉伯数字转换为中文大写数字

    题目 python练习的一个小实验,  题目如下图: 附阿拉伯数字对应的中文大写: 思路 1. 通过定义一个字典进行阿拉伯数字与大写中文的对比储存 2. 将用户的输入首先分割为整数与小数部分分别进行处 ...

  6. 使用Java将阿拉伯数字转换为中文数字(适配小数转换)

    Java数字转换工具类 本文借鉴了该博主所写的工具类 传送门:https://blog.csdn.net/wanlin77/article/details/88853816 初级码农一枚,非常欢迎优化 ...

  7. 阿拉伯数字转换为中文大写数字

    这个功能使用场景不多,百度也能找到很多相关代码,只不过我找了几个看的不是很明白,为了锻炼自己的思维能力,所以就干脆自己写了一个,不仅分享代码,同时也分享一下我的思路 JS代码 let moneyCas ...

  8. jq 数字转中文数字_阿拉伯数字 转换 中文大写

    阿拉伯数字 转换 中文大写 class ToChineseNumber { private $money = ""; private $cnynums = array(" ...

  9. 如何把阿拉伯数字转换为中文大写?

    之前在CSDN论坛里,看有人Show了一些把中文大写转换成阿拉伯数字的程序代码,自己也用Java语言实现了程序设计,基本上能够实现十万亿以内的任何数字的转换.之前也帖出自己的实现代码. 但我个人认为, ...

最新文章

  1. Java获取当前的系统时间
  2. 不包含本位置值的累乘数组
  3. python操作excel表格写入多行和多列_python多处理:写入同一excel-fi
  4. jquery --- 监听input框失效
  5. Oracle创建序列,删除序列
  6. python做些什么项目内容_现在比较流行的python做什么项目最适合?
  7. lda进行图片分类_利用CNN对股票“图片”进行涨跌分类——一次尝试
  8. HTML中行内元素与块级元素的区别:
  9. C#中@字符的三个作用
  10. element表格图片放大_利用element-ui怎么实现一个点击放大图片功能
  11. mysql之魔鬼训练营
  12. Adobe Zii Patcher 4.2.1 Adobe 2019 Mac 版通用一键自动化完美补丁(TNT)出品
  13. 芯烨网口小票打印机,使用PHP打印小票
  14. 分数间隔 matlab,分数间隔均衡器
  15. win7如何进入修复计算机,win7电脑故障怎么进入安全模式修复
  16. 为什么域名能够访问网站,而直接使用IP不可以
  17. 【网站】比较知名的大型公司官网清单可以收藏关注一下,欢迎您来补充
  18. oracle18c升级19,Upgrading Oracle 18c To 19c
  19. 暴风影音下载|暴风影音播放器下载
  20. 儿童发烧、高热,警惕病毒性感冒【程序员爸爸们学着点】

热门文章

  1. BT下载的原理 和疑问
  2. IntelliJ IDEA 日常使用介绍
  3. Linux实验5——Apache、虚拟主机
  4. CAD带文字线型的文字偏移bug介绍
  5. Altium Designer快捷键和规则
  6. Fine-Grained Visual Classification via Progressive Multi-Granularity Training of Jigsaw Patches
  7. 思科新版ccna认证网工一定要知道的PIM技术概述
  8. 你是不是程序员菜鸡,一句话就能证明!
  9. Android开发中保存数据的四种方法方法
  10. mysql中avg函数如果有空值_对于 AVG 函数,如果列中所有行的值都是 null,那么 AVG 函数返回的值是( )...