Python+PyQt编写一个数字转大写金额GUI工具

 更新时间:2025年09月08日 09:54:03   作者:Goona_  
在财务数据处理场景中,数字金额的大写转换是确保票据准确性和防伪性的重要环节,本文将使用Python和PyQt编写一个数字转大写金额GUI工具,有需要的小伙伴可以了解下

一、引言

在财务数据处理场景中,数字金额的大写转换是确保票据准确性和防伪性的重要环节。以跨平台GUI框架PyQt为主体,再将用户输入的数字通过规范化处理,自动转换为符合规定的标准大写格式(如壹、贰、佰、万等),同时支持零、整等特殊情况的分类判断。这种自动化转换不仅避免了人工输入错误的风险,还能显著提升财务人员的工作效率,有效助力于适合报销单、支票、合同等需要严格数字规范的场景。

二、GUI界面设计

使用PyQt5进行界面的搭建,界面如下:

初始界面搭建采用极简风格。用户通过输入数字,再点击“转换!”,即可在下方弹出相应的大写形式。

1.效果演示

当用户输入存在小数时,且在实际生活中,小数点后两位分别表示金额中的“角”和“分”,因此程序对小数点以后的位数最多设置为2当用户输入为纯整数时,转换后的结果要符合“XXXX元整”的格式

2.相关提示

针对输入为空和输入为0这两种无实义的情况,均会给出“请输入有效数字”的提示。

3.界面设计.py

通过pyuic5产生的GUI界面代码UI_CaiwuDaxie.py如下:

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

# Form implementation generated from reading ui file 'UI_CaiwuDaxie.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setEnabled(True)
        Form.resize(500, 390)
        Form.setMinimumSize(QtCore.QSize(500, 390))
        Form.setMaximumSize(QtCore.QSize(500, 390))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/image1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Form.setWindowIcon(icon)
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(330, 50, 141, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.label_8 = QtWidgets.QLabel(Form)
        self.label_8.setGeometry(QtCore.QRect(90, 10, 371, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.label_10 = QtWidgets.QLabel(Form)
        self.label_10.setGeometry(QtCore.QRect(410, 40, 71, 51))
        self.label_10.setText("")
        self.label_10.setPixmap(QtGui.QPixmap(":/image1.png"))
        self.label_10.setObjectName("label_10")
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(40, 110, 181, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(40, 150, 121, 16))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(40, 80, 91, 21))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(40, 180, 421, 191))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label_3.setFont(font)
        self.label_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_3.setText("")
        self.label_3.setTextFormat(QtCore.Qt.PlainText)
        self.label_3.setScaledContents(False)
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setWordWrap(True)
        self.label_3.setIndent(-1)
        self.label_3.setObjectName("label_3")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(260, 110, 191, 23))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "CaiwuDaxie"))
        self.label_5.setText(_translate("Form", "Designed By"))
        self.label_8.setText(_translate("Form", "财务办公——数字金额转大写"))
        self.label.setText(_translate("Form", "大写如下:"))
        self.label_2.setText(_translate("Form", "请输入金额:"))
        self.pushButton.setText(_translate("Form", "转换"))
import ziyuan_rc

三、主要程序详解

1.导入模块和全局变量

import sys
from UI_CaiwuDaxie import *
from PyQt5.QtWidgets import QApplication, QWidget
# 正则表达式
from PyQt5.QtGui import QRegExpValidator
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

shuzi_dict = {'0': '零',
              '1': '壹',
              '2': '贰',
              '3': '叁',
              '4': '肆',
              '5': '伍',
              '6': '陆',
              '7': '柒',
              '8': '捌',
              '9': '玖'}

导入前端页面设计文件:UI_CaiwuDaxie.py;因需要对用户输入作规范要求,故导入QRegExpValidator;不懂为啥需要导入Qtcore的,请看。最后定义数字与大写数字的对应字典为全局变量,方便后续使用。

2.初始化设置

    def __init__(self):
        super(QWidget, self).__init__()
        self.setupUi(self)

        # 允许整数或最多两位小数
        validator = QRegExpValidator(QtCore.QRegExp("^(?!0+\d)\d*\.?\d{0,2}$"))
        self.lineEdit.setValidator(validator)

        self.pushButton.clicked.connect(self.daxie)

首先通过正则表达式定义输入格式:输入内容必须为数字,其他字符输不进去;输入整数和小数均可以,但要求小数部分的位数最多不超过两位,即\d{0,2};且要求输入的整数部分可以以“0”开头,但不能出现两个及两个以上“0”连续开头的情况,目的是避免类似于“00.XX”的不规范情况出现。最后将其应用于lineedit,这里巧妙使用正则表达式提取定义用户输入格式。

最后将pushbutton绑定于daxie。

3.大写转换

    def daxie(self):
        shuzi_str = self.lineEdit.text()

        if (shuzi_str == '0') or (shuzi_str == ''):
            # 无效输入
            QtWidgets.QMessageBox.critical(self, "提示", "请输入有效数字!")
        else:
            # 有效输入
            if '.' in shuzi_str:
                # 用户输入有小数
                zhengshu_str, xiaoshu_str = shuzi_str.split('.')
                if zhengshu_str=='0':
                    # 整数部分为0,只处理小数部分
                    self.label_3.setText(xiaoshu(xiaoshu_str))
                else:
                    # 用户输入有零有整时
                    neirong_zhengshu = zhengshu(zhengshu_str)
                    neirong_xiaoshu = xiaoshu(xiaoshu_str)
                    self.label_3.setText(neirong_zhengshu+'元'+neirong_xiaoshu)
            else:
                # 用户输入为纯整数
                neirong = zhengshu(shuzi_str)
                self.label_3.setText(neirong+'元整')

从lineedit获取用户输入并将其存储在shuzi_str中;判断shuzi_str是否是有效输入(非零、空值),若为无效输入,给出“请输入有效数字”的提示,反之将其细分为三种情况;判断用户输入是否存在小数点“.”,可将输入分为纯整数输入和小数输入;对于纯整数输入,直接调用自定义函数zhengshu得到大写结果,最后在末尾加上“元整”setText给label_3即可;对于小数,若整数部分为0,按照日常生活,一般不读“零元X角X分”,而直接是“X角X分”,故直接调用自定义函数xiaoshu;最后对于有整有小数的输入,分别调用自定义函数zhengshu和xiaoshu,再在两者结果中间添加衔接词“元”setText给label_3即可。

4.自定义函数

def zhengshu(shu):
    jieguo = []

    for i in range(-len(shu), 0, 1):
        jieguo.append(shuzi_dict[shu[i]])
        if (-i)%4 == 0:
            jieguo.append('仟')
        elif (-i)%4 == 3:
            jieguo.append('佰')
        elif (-i)%4 == 2:
            jieguo.append('拾')
        elif (-i)%4 == 1:
            # 每4位为一组,判断是否需要增加“万”、“亿”
            if (-i)//4 == 0:
                pass
            elif (-i)//4 == 1:
                jieguo.append('万')
            elif (-i)//4 == 2:
                jieguo.append('亿')
            else:
                # 最大只到“亿”,可满足日常财务基本使用需求,若想扩大进制,可在此继续增加,与上同理
                pass

    return ''.join(jieguo)

def xiaoshu(shu):
    return shuzi_dict[shu[0]]+'角'+shuzi_dict[shu[1]]+'分'

对于自定义函数zhengshu:首先需要明确如何将数字转换为对应的大写汉字,这里采用负索引进行遍历。对任意数字,最低位在最右,最高位在最左,按负索引遍历契合我们日常习惯,只不过是多了一个负号“—”而已;再通过字典shuzi_dict获取每个数字对应的大写,并将其添加至lst中。

对于在何处分别添加“亿”、“万”、“仟”、“佰”、“拾”这些量词,首先需要找到规律:对于任何一个数字从低位到高位(及从右到左,也印证了最优解是使用负索引)每四位一组分别添加的是“万”和“亿”(如比“亿”更大,同理添加,这里只到“亿”,足以满足日常财务转换需求),若对负索引取反后再对4取整,为1则说明添加“万”,为2则说明添加“亿”(如比“亿”更大,同理添加即可);而对于“仟”、“佰”、“拾”,需要对负索引取反后再对4取余,若余数为0,则添加“仟”;若余数为3,则添加“佰”;若余数为2,则添加“拾”;若余数为1,则说明下一位即将到4位一组的分界点,需要添加更大的计量单位(“万”、“亿”)

对于自定义函数xiaoshu,直接通过查询字典shuzi_dict并返回拼接结果即可。

四、总程序代码

import sys
from UI_CaiwuDaxie import *
from PyQt5.QtWidgets import QApplication, QWidget
# 正则表达式
from PyQt5.QtGui import QRegExpValidator
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

shuzi_dict = {'0': '零',
              '1': '壹',
              '2': '贰',
              '3': '叁',
              '4': '肆',
              '5': '伍',
              '6': '陆',
              '7': '柒',
              '8': '捌',
              '9': '玖'}

class login_interface(QWidget, Ui_Form):
    def __init__(self):
        super(QWidget, self).__init__()
        self.setupUi(self)

        # 允许整数或最多两位小数
        validator = QRegExpValidator(QtCore.QRegExp("^(?!0+\d)\d*\.?\d{0,2}$"))
        self.lineEdit.setValidator(validator)

        self.pushButton.clicked.connect(self.daxie)

    def daxie(self):
        shuzi_str = self.lineEdit.text()

        if (shuzi_str == '0') or (shuzi_str == ''):
            # 无效输入
            QtWidgets.QMessageBox.critical(self, "提示", "请输入有效数字!")
        else:
            # 有效输入
            if '.' in shuzi_str:
                # 用户输入有小数
                zhengshu_str, xiaoshu_str = shuzi_str.split('.')
                if zhengshu_str=='0':
                    # 整数部分为0,只处理小数部分
                    self.label_3.setText(xiaoshu(xiaoshu_str))
                else:
                    # 用户输入有零有整时
                    neirong_zhengshu = zhengshu(zhengshu_str)
                    neirong_xiaoshu = xiaoshu(xiaoshu_str)
                    self.label_3.setText(neirong_zhengshu+'元'+neirong_xiaoshu)
            else:
                # 用户输入为纯整数
                neirong = zhengshu(shuzi_str)
                self.label_3.setText(neirong+'元整')
def zhengshu(shu):
    jieguo = []

    for i in range(-len(shu), 0, 1):
        jieguo.append(shuzi_dict[shu[i]])
        if (-i)%4 == 0:
            jieguo.append('仟')
        elif (-i)%4 == 3:
            jieguo.append('佰')
        elif (-i)%4 == 2:
            jieguo.append('拾')
        elif (-i)%4 == 1:
            # 每4位为一组,判断是否需要增加“万”、“亿”
            if (-i)//4 == 0:
                pass
            elif (-i)//4 == 1:
                jieguo.append('万')
            elif (-i)//4 == 2:
                jieguo.append('亿')
            else:
                # 最大只到“亿”,可满足日常财务基本使用需求,若想扩大进制,可在此继续增加,与上同理
                pass

    return ''.join(jieguo)

def xiaoshu(shu):
    return shuzi_dict[shu[0]]+'角'+shuzi_dict[shu[1]]+'分'

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = login_interface()
    w.show()
    sys.exit(app.exec_())

到此这篇关于Python+PyQt编写一个数字转大写金额GUI工具的文章就介绍到这了,更多相关Python数字转大写金额内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现聊天小程序

    python实现聊天小程序

    这篇文章主要为大家详细介绍了python实现聊天小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python selenium webdriver 基本使用代码分享

    Python selenium webdriver 基本使用代码分享

    这篇文章主要介绍了Python selenium webdriver 基本使用,本文仅仅简单介绍了selenium的使用常用代码分享,需要的朋友可以参考下
    2022-11-11
  • 最小二乘法及其python实现详解

    最小二乘法及其python实现详解

    今天小编就为大家分享一篇最小二乘法及其python实现详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享

    python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享

    这篇文章主要介绍了python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享,一个不太会遇到的问题,需要的朋友可以参考下
    2014-07-07
  • Linux RedHat下安装Python2.7开发环境

    Linux RedHat下安装Python2.7开发环境

    这篇文章主要为大家详细介绍了Linux RedHat下安装Python2.7、pip、ipython环境、eclipse和PyDev环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Python实现两种稀疏矩阵的最小二乘法

    Python实现两种稀疏矩阵的最小二乘法

    这篇文章主要为大家详细介绍了Python实现的两种稀疏矩阵最小二乘法lsqr和lsmr,前者是经典算法,后者来自斯坦福优化实验室,据称可以比lsqr更快收敛,感兴趣的可以了解一下
    2023-02-02
  • python实现银联支付和支付宝支付接入

    python实现银联支付和支付宝支付接入

    这篇文章主要为大家详细介绍了python实现银联支付和支付宝支付的接入,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Python3中的多行输入问题

    Python3中的多行输入问题

    这篇文章主要介绍了Python3中的多行输入问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • python数据分析之时间序列分析详情

    python数据分析之时间序列分析详情

    这篇文章主要介绍了python数据分析之时间序列分析详情,时间序列分析是基于随机过程理论和数理统计学方法,具体详细内容介绍,需要的小伙伴可以参考一下
    2022-08-08
  • 简单几步教你学会Python接口自动化测试

    简单几步教你学会Python接口自动化测试

    这篇文章主要介绍了简单几步教你学会Python接口自动化测试,本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,期望读者可以通过本文对接口自动化测试有一个大致的了解,需要的朋友可以参考下
    2023-08-08

最新评论