阳光石油网|石油技术交流|石油人论坛

 找回密码
 欢迎注册
查看: 1306|回复: 7

[职业规划] 学python的一点零碎玩意儿:数字转汉字

[复制链接]
  • TA的每日心情
    开心
    2014-1-11 00:20
  • 签到天数: 38 天

    [LV.5]常住居民I

    发表于 2018-12-7 12:12:07 | 显示全部楼层 |阅读模式

    马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。

    您需要 登录 才可以下载或查看,没有账号?欢迎注册

    x
    _MA = ('〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', )

    def DataCNex_d(num):
        _P0 = ('', '十','百','千','万','十','百','千','亿','十','百','千','万','十万','百万', '千万',)

        num_str = str(num)
        len_num = len(num_str)
        result = ''

        for i in range(len_num,0,-1):      
            str_i = int(num_str[len_num-i])

            if i > 1:
                str_i_p = int(num_str[len_num+1-i])
            else:
                str_i_p = -1
            
            if i < len_num :
                str_i_s = int(num_str[len_num-1-i])
            else:
                str_i_s = -1
            
            if str_i != 0 :
                if 1 == str_i and 2 == i and 0 > str_i_s:
                    result += _P0[i-1]   
                else:
                    result += _MA[str_i] + _P0[i-1]                             
            else:
                if 4 == (i-1) or 8 == (i-1):
                    result += _P0[i-1]
                if 0 < str_i_p :
                    result += _MA[str_i]   
        return result

    def DataNCex_p(num):
        num_str = str(num)
        len_num = len(num_str)
        result = ''
        for i in range(len_num,0,-1):  
            str_i = int(num_str[len_num-i])
            result += _MA[str_i]
        return result

    def DataCNex(num, Ttype = ''):
        if '' == Ttype:
            Ttype = str(type(num))
        if "int" in Ttype:
            return DataCNex_d(num)
        elif "date" in Ttype:
            return DataNCex_p(int(num))
        elif "float" in Ttype:
            d,p = (str(num).split('.'))
            return DataCNex_d(int(d))+"点"+DataNCex_p(p)


    print (DataCNex(20008007012))
    print (DataCNex(200080.07012))
    print (DataCNex(15))
    游客,如果您要查看本帖隐藏内容请回复


    二百亿〇八百万〇七千〇一十二
    二十万〇八十点〇七〇一二
    十五



  • TA的每日心情
    开心
    2014-1-11 00:20
  • 签到天数: 38 天

    [LV.5]常住居民I

     楼主| 发表于 2018-12-7 15:35:07 | 显示全部楼层
    刚刚又改进了一点儿:

    _M0 = ('〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', )
    _M1 = ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', )

    def DataCNex_d(num, Ttype = ''):
        _P0 = ('', '十','百','千','万','十','百','千','亿','十','百','千','万','十万','百万', '千万',)
        _P1 = ('', '拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟','万','拾万','佰万', '仟万',)

        if 'uppercase' == Ttype:
            Ttype = 1
        else:
            Ttype = 0

        num_str = str(num)
        len_num = len(num_str)
        result = ''

        for i in range(len_num,0,-1):      
            str_i = int(num_str[len_num-i])

            if i > 1:
                str_i_p = int(num_str[len_num+1-i])
            else:
                str_i_p = -1
            
            if i < len_num :
                str_i_s = int(num_str[len_num-1-i])
            else:
                str_i_s = -1
            
            if str_i != 0 :
                if 1 == str_i and 2 == i and 0 > str_i_s:
                    if Ttype:
                        result += _P1[i-1]
                    else:
                        result += _P0[i-1]
                else:
                    if Ttype:
                        result += _M1[str_i] + _P1[i-1]                                   
                    else:
                        result += _M0[str_i] + _P0[i-1]                             
            else:
                if 4 == (i-1) or 8 == (i-1):
                    if Ttype:
                        result += _P1[i-1]      
                    else:         
                        result += _P0[i-1]
                if 0 < str_i_p :
                    if Ttype:
                        result += _M1[str_i]
                    else:
                        result += _M0[str_i]   
        return result

    def DataNCex_p(num, Ttype = ''):
       
        if 'uppercase' == Ttype:
            Ttype = 1
        else:
            Ttype = 0

        num_str = str(num)
        len_num = len(num_str)
        result = ''
        for i in range(len_num,0,-1):  
            str_i = int(num_str[len_num-i])
            if Ttype:
                result += _M1[str_i]
            else:
                result += _M0[str_i]
        return result

    def DataCNex(num, Ttype = '', Ctype = ''):

        if "uppercase" in Ttype:
            Ctype = Ttype
            Ttype = ''

        if '' == Ttype:
            Ttype = str(type(num))

        if "int" in Ttype:
            return DataCNex_d(num, Ctype)
        elif "date" in Ttype:
            return DataNCex_p(int(num), Ctype)
        elif "float" in Ttype:
            d,p = (str(num).split('.'))
            return DataCNex_d(int(d), Ctype)+"点"+DataNCex_p(p, Ctype)
       
    print (DataCNex(20008007012))
    print (DataCNex(20008007012, 'uppercase'))
    print (DataCNex(20008007012, 'date'))
    print (DataCNex(20008007012, 'date', 'uppercase'))
    print (DataCNex(200080.07012, 'uppercase'))
    print (DataCNex(15))

    运行结果:

    二百亿〇八百万〇七千〇一十二
    贰佰亿零捌佰万零柒仟零壹拾贰
    二〇〇〇八〇〇七〇一二
    贰零零零捌零零柒零壹贰
    贰拾万零捌拾点零柒零壹贰
    十五




    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-1-11 00:20
  • 签到天数: 38 天

    [LV.5]常住居民I

     楼主| 发表于 2018-12-7 17:11:50 | 显示全部楼层
    说实话,学习一种计算机编程语言只是学到几十行的句子来做一个简单的替换是很基础的事情,自然是绝对不值得骄傲。

    我之所以要把这么无聊的事情特意贴在这里是想要说一句跟编程这个主题并不相关,却与大家“职业规划”息息相关的思考。

    把一串数字转化成中文表达的过程中我们最容易的就是看到我们这种语言在组合这样的理念中的逻辑关系。逻辑性比较差的表达我其实在网上是找到了的,表达过程比我现在写的还要长,却没有办法完全准确去转译成合适的中文。换一句说法:网上现在流行的那个程序(我觉得这么小的东西其实还是应该叫做脚本,但是考虑到更多人现在是这么称呼自己编写的一段一段小的代码段的,所以也就顺着叫罢)的作者是调试中遇到了一个问题就去设定一个选择来规避问题,而没有试图理解他所遇到的总问题的脉络。更简单一点说:他只是想应付差事而不是把问题拆解清楚了!

    事实上,一个问题如果能够像这件事这样从逻辑上拆解清楚就会找到一个比较可以复制的解决类似问题的策略,而不会每次都在遭遇问题的时候手忙脚乱的解决一个又一个突然冒出来的错误。

    如果愿意,我们也可以说:一个人,要有战略视野,要有那么一点点大局观。

    其实我们身边很多问题都是可以从逻辑角度进行拆解的,即便是不是我们熟悉的领域也是一样。就比方说我们现在看到的很多事务,说到根本总不过就是投入成本、运行风险和预期收益等几个大块上去思考。中国人的智慧甚至于可以简化成三个字,叫做“权、责、利”。如果你在看到团队或者公司遇到一个项目、一个机遇、一个挑战的时候,你如果能够从这几个方面去把事情作第一步的拆解,那么极有可能你会发现你比原来更加容易理解(或者鄙视)你的主管或老板的思考。

    就是这样。


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-8-18 10:56
  • 签到天数: 1201 天

    [LV.10]以坛为家III

    发表于 2018-12-10 09:21:01 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-1-11 00:20
  • 签到天数: 38 天

    [LV.5]常住居民I

     楼主| 发表于 2018-12-14 15:35:58 | 显示全部楼层
    继续学习,不断熟悉python风格:

    def DataCNex(num, Ttype = '', Ctype = ''):

        '''
        语法说明:
        DataCNex(integer/float/'time struct', string, string) -> string
       
        Ttype
            一般供内部保留。参数意思:数据类型,但是主要的类型是根据第一个参数num去自动判断
            ='date',只输出单数字,不带“十百千万”等表位字
        Ctype
            参数意思:中文的大小写或者时间输出是否精确到时分秒
            ='uppercase',输出大写数字
            ='fulltime',输出年月日时分秒

        在Ttype不特别说明的时候可以直接输入Ctype

        例如
            print (DataCNex(20008007012))
            print (DataCNex(20008007012, 'uppercase'))
            print (DataCNex(20008007012, 'date'))
            print (DataCNex(20008007012, 'date', 'uppercase'))
            print (DataCNex(200080.07012, 'uppercase'))

        如果 import time
            print (DataCNex(localtime()))
            print (DataCNex(localtime(), 'fulltime'))

        '''

        if "uppercase" in Ttype or 'fulltime' in Ttype:
            Ctype = Ttype
            Ttype = ''
        if 'uppercase' == Ctype:
            M0 = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
            P0 = ['', '拾','佰','仟','万','拾','佰','仟','亿','拾','佰','仟','万','拾万','佰万', '仟万']
        else:
            M0 = ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九']
            P0 = ['', '十','百','千','万','十','百','千','亿','十','百','千','万','十万','百万', '千万']

        if '' == Ttype:
            Ttype = str(type(num))

        if "int" in Ttype:
            return DataCNex_d(num, M0, P0)
        elif "date" in Ttype:
            return DataCNex_p(int(num), M0)
        elif "float" in Ttype:
            d,p = (str(num).split('.'))
            return DataCNex_d(int(d), M0, P0)+"点"+DataCNex_p(p, M0)
        elif 'struct_time' in Ttype:
            if 'fulltime' in Ctype:
                return ("%s年%s月%s日,星期%s,%s时%s分%s秒" % \
                (DataCNex_p(num.tm_year, M0), DataCNex_d(num.tm_mon, M0, P0), DataCNex_d(num.tm_mday, M0, P0), \
                 DataCNex_p(num.tm_wday + 1, M0), DataCNex_d(num.tm_hour, M0, P0), DataCNex_d(num.tm_min, M0, P0), \
                 DataCNex_d(num.tm_sec, M0, P0)))

            else:
                return ("%s年%s月%s日,星期%s" % \
                (DataCNex_p(num.tm_year, M0), DataCNex_d(num.tm_mon, M0, P0), DataCNex_d(num.tm_mday, M0, P0), \
                 DataCNex_p(num.tm_wday + 1, M0)))

        else:
            return "错误:数据类型 %s,请输入整形数或者浮点数。" % str(type(num))


    def DataCNex_d(num, _M0, _P0):
            
        a_list = list(str(num))
        a_len = len(a_list)
        result =''
        for i,aa, pp in zip(range(a_len), a_list, _P0[a_len-1::-1]):
            if 0 != int(aa):
                if a_len-2 == i and '1' == aa and 2 == a_len:                     
                    result += pp
                else:
                    result += _M0[int(aa)] + pp
            else:
                if a_len-5 == i or a_len-9 == i:
                    result += pp
                if a_len-1 != i and int(a_list[i+1]):
                    result += _M0[int(aa)]
        return result

    def DataCNex_p(num, _M0):

        result = ''
        for aa in list(str(num)):
            result += _M0[int(aa)]
        return result


    if __name__ == "__main__":
        print (DataCNex(20008007012))
        print (DataCNex(10))
        print (DataCNex(15))
        print (DataCNex(20008007012, 'uppercase'))
        print (DataCNex(20008007012, 'date'))
        print (DataCNex(20008007012, 'date', 'uppercase'))
        print (DataCNex(200080.07012, 'uppercase'))
        print (DataCNex(200080.07012,'date', 'uppercase'))
        print (DataCNex('test'))



    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-1-11 00:20
  • 签到天数: 38 天

    [LV.5]常住居民I

     楼主| 发表于 2018-12-14 15:37:52 | 显示全部楼层
    调用函数样例:

    #
    ## 调用DataCNex函数样例
    #

    from time import localtime, strftime
    from test22 import DataCNex as CNdata

    CNtime = CNdata

    print (CNdata(200340.324234))
    print (CNdata(200340.324234, 'uppercase'))

    print (CNtime(localtime()))
    print (CNtime(localtime(), 'fulltime'))

    print (strftime("%A, %d %B %Y, %H:%M:%S", localtime()))



    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 175 天

    [LV.7]常住居民III

    发表于 2019-8-16 16:22:19 | 显示全部楼层

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    半小时前
  • 签到天数: 1371 天

    [LV.10]以坛为家III

    发表于 2020-12-18 15:59:40 | 显示全部楼层
    好东西
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 欢迎注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|阳光石油网 ( 鲁ICP备2021003870号-1 )

    GMT+8, 2024-6-7 18:43 , Processed in 0.063597 second(s), 21 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表