鱼C论坛

 找回密码
 立即注册
查看: 3987|回复: 13

[已解决]人民币大写,太难

[复制链接]
发表于 2021-6-20 19:18:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
【问题描述】

    在发票上通常要加印大写汉字金额,编写一个程序,对键盘上输入一个13位内的整数,将其转换为大写汉字的人民币金额。

【输入形式】

    输入一个整数
【输出形式】

    输出大写的人民币金额
【样例输入】

123456789

【样例输出】

壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元整

【样例说明】

为解决系统中文不能输出问题,请在源程序前面加上下面语句:

import io

import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')

sys.stdin = io.TextIOWrapper(sys.stdin.buffer,encoding='utf-8')
最佳答案
2021-6-27 13:47:40
本帖最后由 sunrise085 于 2021-6-27 13:53 编辑

这个问题我之前写过,当时要比你这个更加复杂。
难点在于中间0的处理。我把之前的程序简单地删减了一下,或许还可以更加精简。
你看看。
numch = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
rmbqian = ["","拾","佰","仟"]
rmbpian = ["","萬","亿"]
#10000以内整数进行转换
def qian_exc(str1):
    num=int(str1)
    result=''
    k=0
    while num:
        a=num%10
        num=num//10
        if a!=0:
            result=rmbqian[k]+result
        result=numch[a]+result
        k+=1
    result=result.strip('零')
    if result.count('零')>1:
        result=result.replace('零','',1)
    if int(str1)<1000:
        result='零'+result
    return result
#将整数部分进行转换
def yuan_exc(str_yuan):
    yuan=[]
    while str_yuan:
        yuan.append(str_yuan[-4:])
        str_yuan=str_yuan[:-4]
    readwords='圆'
    for i in range(len(yuan)):
        piece=qian_exc(yuan[i])
        if piece!='零':
            readwords = rmbpian[i] + readwords
            readwords = piece + readwords
    if readwords[0]=='零':
        readwords=readwords[1:]
    readwords= readwords.replace('零零','零')
    if readwords[-2]=='零':
        readwords=readwords[:-2]+'圆'
    return readwords

yuan_words=''
l=1
str1=input('请输入:')
while l: #保证输入正确
    l=0
    try:
        f=int(str1)
        if f<0:
            str1=input('请输入一个正数:')
            l=1
    except:
        str1=input('有错误字符,请重新输入:')

if str1!='0':            #整数部分不为0,进行转换
    yuan_words=yuan_exc(str1)

if yuan_words=='':               #输入为0时,say_words==''
    yuan_words='零圆'
yuan_words=yuan_words+'整'              #在最后添加“整”
    
print(yuan_words)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-23 15:04:01 | 显示全部楼层
本帖最后由 nahongyan1997 于 2021-6-23 15:05 编辑

一年前我研究过,太容易出bug,就放弃了。。

比如一亿亿万二千
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-24 16:13:16 | 显示全部楼层
nahongyan1997 发表于 2021-6-23 15:04
一年前我研究过,太容易出bug,就放弃了。。

比如一亿亿万二千

等我找助教要答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-24 16:34:42 | 显示全部楼层
lsdsg 发表于 2021-6-24 16:13
等我找助教要答案

哇,你要分享给我吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 02:13:18 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-6-25 14:11 编辑

题目里 “一个13位内的整数”, 我的认为是: 最大12位,即 9999 9999 9999 最大。
好,看代码:
# 思路:分别对 亿以上,万以上,万以下的,做类似的处理。小心注意处理中间各种零的情况

# 代码实现:
s = input()
assert int(s) > 0
# 分别取出 亿以上,万以上,万以下的
sy, sw, sq = '', '', ''
if len(s) > 8:                  # 一亿以上的(9到12位位数)
    sy = s[:len(s)-8]
    sw = s[len(s)-8:len(s)-4]
    sq = s[-4:]
elif len(s) <= 8 and len(s) > 4:  # 小于一亿,但大于等于一万的 (五位到八位数)
    sw, sq = s[:-4], s[-4:]
else:
    sq = s                       # 小于一万的

# 或者 简单的
s = '0'*(12-len(s)) + s 
sy, sw, sq = s[:4], s[4:8], s[8:]
# print(sy, sw, sq)

# 处理仟佰拾,以及中间有零的情况
n, zh = '0123456789', "零壹贰叁肆伍陆柒捌玖"
def qbs(sx=''):
    if sx == '' or sx == '0000':      # 处理像1234-0000-1234里的0000 (没“万”)
        return ''
    elif sx[0] == '0' or sx[:2] == '00' or sx[:3] == '000':             # 处理像 0111, 0011, 0001 
        return ("零"+str(int(sx))).translate(''.maketrans(n, zh))
    else:
        x = "仟佰拾" if len(sx) == 4 else "佰拾" if len(sx) == 3 else "拾" if len(sx) == 2 else ""
        t = ''.join([n + z for n, z in zip(sx[:-1], x)]) + sx[-1]
        t = t.replace("0佰0拾0", "").replace("0拾0", "").replace("0", "")  # 处理像 1000, 1100, 1110
        return t.translate(''.maketrans(n, zh))

print(
    qbs(sx=sy), "亿" if qbs(sy) != '' else "",
    qbs(sw), "万" if qbs(sw) != '' else "",
    qbs(sq), "元整" if qbs(sq) != '' else '', 
    sep='')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 08:50:56 | 显示全部楼层
本帖最后由 nahongyan1997 于 2021-6-25 09:09 编辑
阿奇_o 发表于 2021-6-25 02:13
题目里 “一个13位内的整数”, 我的认为是: 最大12位,即 9999 9999 9999 最大。
好,看代码:


大佬,你的代码被我破解了,

120412040124    这个数字没法识别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 11:36:07 | 显示全部楼层
def 转换(变量):
    大写字典 = {1: '壹', 2: '贰', 3: '叁', 4: '肆', 5: '伍', 6: '陆', 7: '柒', 8: '捌', 9: '玖', 0: '零'}
    单位字典1 = {0:'',1:'十',2:'百',3:'千'}
    单位字典2 = {0:'',1:'万',2:'亿',3:'兆'}
    列表 = [int(拆分) for 拆分 in str(变量)]
    列表颠倒 = 列表[::-1]
    返回字符串="元整"
    for 字符组合数组位置变量 in range(len(列表颠倒)):
        # 添加单位字典1
        返回字符串 = ''.join([大写字典[列表颠倒[字符组合数组位置变量]],单位字典1[(字符组合数组位置变量)%4],返回字符串])

        # 添加单位字典2,添加单位
        if not (字符组合数组位置变量 + 1) % 4 and (字符组合数组位置变量 + 1) < len(列表颠倒):
            返回字符串 = ''.join([单位字典2[(字符组合数组位置变量 + 1) // 4], 返回字符串])
    return 返回字符串

print(转换(123456789))

应该还有小BUG,但是不重要,思路就是这样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 13:47:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2021-6-27 13:53 编辑

这个问题我之前写过,当时要比你这个更加复杂。
难点在于中间0的处理。我把之前的程序简单地删减了一下,或许还可以更加精简。
你看看。
numch = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
rmbqian = ["","拾","佰","仟"]
rmbpian = ["","萬","亿"]
#10000以内整数进行转换
def qian_exc(str1):
    num=int(str1)
    result=''
    k=0
    while num:
        a=num%10
        num=num//10
        if a!=0:
            result=rmbqian[k]+result
        result=numch[a]+result
        k+=1
    result=result.strip('零')
    if result.count('零')>1:
        result=result.replace('零','',1)
    if int(str1)<1000:
        result='零'+result
    return result
#将整数部分进行转换
def yuan_exc(str_yuan):
    yuan=[]
    while str_yuan:
        yuan.append(str_yuan[-4:])
        str_yuan=str_yuan[:-4]
    readwords='圆'
    for i in range(len(yuan)):
        piece=qian_exc(yuan[i])
        if piece!='零':
            readwords = rmbpian[i] + readwords
            readwords = piece + readwords
    if readwords[0]=='零':
        readwords=readwords[1:]
    readwords= readwords.replace('零零','零')
    if readwords[-2]=='零':
        readwords=readwords[:-2]+'圆'
    return readwords

yuan_words=''
l=1
str1=input('请输入:')
while l: #保证输入正确
    l=0
    try:
        f=int(str1)
        if f<0:
            str1=input('请输入一个正数:')
            l=1
    except:
        str1=input('有错误字符,请重新输入:')

if str1!='0':            #整数部分不为0,进行转换
    yuan_words=yuan_exc(str1)

if yuan_words=='':               #输入为0时,say_words==''
    yuan_words='零圆'
yuan_words=yuan_words+'整'              #在最后添加“整”
    
print(yuan_words)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 13:50:55 | 显示全部楼层
sunrise085 发表于 2021-6-27 13:47
这个问题我之前写过,当时要比你这个更加复杂。
难点在于中间0的处理。我把之前的程序简单地删减了一下, ...

人家在银行工作,你得保证你这个玩意不会出bug啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 13:55:03 | 显示全部楼层
nahongyan1997 发表于 2021-6-27 13:50
人家在银行工作,你得保证你这个玩意不会出bug啊

小朋友,不要整天的怼天怼地怼空气

空说无凭,你找出bug啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-6-27 14:02:20 | 显示全部楼层
sunrise085 发表于 2021-6-27 13:55
小朋友,不要整天的怼天怼地怼空气

空说无凭,你找出bug啊

我测试通过了,大老牛逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 14:38:37 | 显示全部楼层
求答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-27 15:16:20 | 显示全部楼层

10 楼的答案没有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-30 17:12:24 | 显示全部楼层
sunrise085 发表于 2021-6-27 13:55
小朋友,不要整天的怼天怼地怼空气

空说无凭,你找出bug啊

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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