Python+PyQt編寫一個數(shù)字轉大寫金額GUI工具
一、引言
在財務數(shù)據(jù)處理場景中,數(shù)字金額的大寫轉換是確保票據(jù)準確性和防偽性的重要環(huán)節(jié)。以跨平臺GUI框架PyQt為主體,再將用戶輸入的數(shù)字通過規(guī)范化處理,自動轉換為符合規(guī)定的標準大寫格式(如壹、貳、佰、萬等),同時支持零、整等特殊情況的分類判斷。這種自動化轉換不僅避免了人工輸入錯誤的風險,還能顯著提升財務人員的工作效率,有效助力于適合報銷單、支票、合同等需要嚴格數(shù)字規(guī)范的場景。
二、GUI界面設計
使用PyQt5進行界面的搭建,界面如下:

初始界面搭建采用極簡風格。用戶通過輸入數(shù)字,再點擊“轉換!”,即可在下方彈出相應的大寫形式。
1.效果演示

當用戶輸入存在小數(shù)時,且在實際生活中,小數(shù)點后兩位分別表示金額中的“角”和“分”,因此程序對小數(shù)點以后的位數(shù)最多設置為2;當用戶輸入為純整數(shù)時,轉換后的結果要符合“XXXX元整”的格式。
2.相關提示


針對輸入為空和輸入為0這兩種無實義的情況,均會給出“請輸入有效數(shù)字”的提示。
3.界面設計.py
通過pyuic5產(chǎn)生的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", "財務辦公——數(shù)字金額轉大寫"))
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;因需要對用戶輸入作規(guī)范要求,故導入QRegExpValidator;;不懂為啥需要導入Qtcore的,請看。最后定義數(shù)字與大寫數(shù)字的對應字典為全局變量,方便后續(xù)使用。
2.初始化設置
def __init__(self):
super(QWidget, self).__init__()
self.setupUi(self)
# 允許整數(shù)或最多兩位小數(shù)
validator = QRegExpValidator(QtCore.QRegExp("^(?!0+\d)\d*\.?\d{0,2}$"))
self.lineEdit.setValidator(validator)
self.pushButton.clicked.connect(self.daxie)首先通過正則表達式定義輸入格式:輸入內(nèi)容必須為數(shù)字,其他字符輸不進去;輸入整數(shù)和小數(shù)均可以,但要求小數(shù)部分的位數(shù)最多不超過兩位,即\d{0,2};且要求輸入的整數(shù)部分可以以“0”開頭,但不能出現(xiàn)兩個及兩個以上“0”連續(xù)開頭的情況,目的是避免類似于“00.XX”的不規(guī)范情況出現(xiàn)。最后將其應用于lineedit,這里巧妙使用正則表達式提取定義用戶輸入格式。
最后將pushbutton綁定于daxie。
3.大寫轉換
def daxie(self):
shuzi_str = self.lineEdit.text()
if (shuzi_str == '0') or (shuzi_str == ''):
# 無效輸入
QtWidgets.QMessageBox.critical(self, "提示", "請輸入有效數(shù)字!")
else:
# 有效輸入
if '.' in shuzi_str:
# 用戶輸入有小數(shù)
zhengshu_str, xiaoshu_str = shuzi_str.split('.')
if zhengshu_str=='0':
# 整數(shù)部分為0,只處理小數(shù)部分
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:
# 用戶輸入為純整數(shù)
neirong = zhengshu(shuzi_str)
self.label_3.setText(neirong+'元整')從lineedit獲取用戶輸入并將其存儲在shuzi_str中;判斷shuzi_str是否是有效輸入(非零、空值),若為無效輸入,給出“請輸入有效數(shù)字”的提示,反之將其細分為三種情況;判斷用戶輸入是否存在小數(shù)點“.”,可將輸入分為純整數(shù)輸入和小數(shù)輸入;對于純整數(shù)輸入,直接調(diào)用自定義函數(shù)zhengshu得到大寫結果,最后在末尾加上“元整”setText給label_3即可;對于小數(shù),若整數(shù)部分為0,按照日常生活,一般不讀“零元X角X分”,而直接是“X角X分”,故直接調(diào)用自定義函數(shù)xiaoshu;最后對于有整有小數(shù)的輸入,分別調(diào)用自定義函數(shù)zhengshu和xiaoshu,再在兩者結果中間添加銜接詞“元”setText給label_3即可。
4.自定義函數(shù)
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:
# 最大只到“億”,可滿足日常財務基本使用需求,若想擴大進制,可在此繼續(xù)增加,與上同理
pass
return ''.join(jieguo)
def xiaoshu(shu):
return shuzi_dict[shu[0]]+'角'+shuzi_dict[shu[1]]+'分'對于自定義函數(shù)zhengshu:首先需要明確如何將數(shù)字轉換為對應的大寫漢字,這里采用負索引進行遍歷。對任意數(shù)字,最低位在最右,最高位在最左,按負索引遍歷契合我們?nèi)粘A晳T,只不過是多了一個負號“—”而已;再通過字典shuzi_dict獲取每個數(shù)字對應的大寫,并將其添加至lst中。
對于在何處分別添加“億”、“萬”、“仟”、“佰”、“拾”這些量詞,首先需要找到規(guī)律:對于任何一個數(shù)字,從低位到高位(及從右到左,也印證了最優(yōu)解是使用負索引)每四位一組,分別添加的是“萬”和“億”(如比“億”更大,同理添加,這里只到“億”,足以滿足日常財務轉換需求),若對負索引取反后再對4取整,為1則說明添加“萬”,為2則說明添加“億”(如比“億”更大,同理添加即可);而對于“仟”、“佰”、“拾”,需要對負索引取反后再對4取余,若余數(shù)為0,則添加“仟”;若余數(shù)為3,則添加“佰”;若余數(shù)為2,則添加“拾”;若余數(shù)為1,則說明下一位即將到4位一組的分界點,需要添加更大的計量單位(“萬”、“億”)。
對于自定義函數(shù)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)
# 允許整數(shù)或最多兩位小數(shù)
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, "提示", "請輸入有效數(shù)字!")
else:
# 有效輸入
if '.' in shuzi_str:
# 用戶輸入有小數(shù)
zhengshu_str, xiaoshu_str = shuzi_str.split('.')
if zhengshu_str=='0':
# 整數(shù)部分為0,只處理小數(shù)部分
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:
# 用戶輸入為純整數(shù)
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:
# 最大只到“億”,可滿足日常財務基本使用需求,若想擴大進制,可在此繼續(xù)增加,與上同理
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編寫一個數(shù)字轉大寫金額GUI工具的文章就介紹到這了,更多相關Python數(shù)字轉大寫金額內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python?selenium?webdriver?基本使用代碼分享
這篇文章主要介紹了Python?selenium?webdriver?基本使用,本文僅僅簡單介紹了selenium的使用常用代碼分享,需要的朋友可以參考下2022-11-11
python的描述符(descriptor)、裝飾器(property)造成的一個無限遞歸問題分享
這篇文章主要介紹了python的描述符(descriptor)、裝飾器(property)造成的一個無限遞歸問題分享,一個不太會遇到的問題,需要的朋友可以參考下2014-07-07
Linux RedHat下安裝Python2.7開發(fā)環(huán)境
這篇文章主要為大家詳細介紹了Linux RedHat下安裝Python2.7、pip、ipython環(huán)境、eclipse和PyDev環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
python實現(xiàn)銀聯(lián)支付和支付寶支付接入
這篇文章主要為大家詳細介紹了python實現(xiàn)銀聯(lián)支付和支付寶支付的接入,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05

