首页 > 其他分享 >Qt 中 qint64 转 汉字写法

Qt 中 qint64 转 汉字写法

时间:2024-04-26 14:56:10浏览次数:19  
标签:Qt res qint64 QStringList numb 写法 cnNumWeight cump

9223372036854775807 转为 九百二十二兆三千三百七十二亿零三百六十八万五千四百七十七万五千八百零七

注意:此过程并未检查 qint64 类型的的上限!!

使用的是中国传统的乘方数位,即“一百个一百为一万,一万个一万是一亿,一亿个一亿是一兆”,即可有如下数位:
个,十,百,千,万,十万,百万,千万,亿,十亿,百亿,千亿,万亿,十万亿,百万亿,千万亿,兆

因而,一万是104,一亿是108,一兆是1016

QString int2ChnsNum(qint64 num) {
	QStringList int2cnNum = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" };
	QStringList cnNumWeight = { "","十", "百", "千" };
	std::function<QStringList(const QStringList& cnNum, const QStringList& cnNumWeight, qint64 numb)> recu = [&](const QStringList& cnNum, const QStringList& cnNumWeight, qint64 numb)->QStringList {
		QStringList res;
		QString rr;
		QList<QPair<qint64, QString>> mp = { {9999999999999999, "兆"},{99999999,"亿"},{9999,"万"} };
		qint64 restNum;
		for (QPair<qint64, QString>& cump : mp) {
			if (numb > cump.first) {
				qint64 dig = numb % (cump.first + 1);
				if (dig) {
					res.append(recu(cnNum, cnNumWeight, dig));
				}
				qint64 rest = numb / (cump.first + 1);
				if (rest) {
					QStringList t = recu(cnNum, cnNumWeight, rest);
					t.append(cump.second);
					t.append(res);
					res = t;
				}
				break;
			} else if (numb < 10000) {
				int tn = numb;
				for (int w = 0; w < 4; ++w) {
					int d = numb % 10;
					numb /= 10;
					if (d && !cnNumWeight.value(w).isEmpty())
						res.prepend(cnNumWeight.value(w));
					res.prepend(cnNum.value(d));
				}
			}
		}

		return res;
	};

	// 中间的多个“零”合并成一个零,去除开头和结尾的“零”
	QString res = recu(int2cnNum, cnNumWeight, num).join("");
	res.replace(QRegularExpression("零{2,}"), "零").replace("零万", "万").replace("零亿","亿").replace("零兆", "兆");
	if (res.startsWith("零"))
		res.remove(0, 1);
	if (res.endsWith("零"))
		res.remove(res.count() - 1, 1);

	// 整几千的时候不需要“零”
	QRegularExpression re("零(.{1})千");
	do {
		res.remove(res.lastIndexOf(re), 1);
	} while (res.indexOf(re) > -1);

	return res;
}

main.cpp

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	QStringList res;
	qint64 num = 9223300000000705817;

	qDebug() << int2ChnsNum(num);

	return app.exec();
}

输出

九百二十二兆三千三百万亿零七十万五千八百一十七

标签:Qt,res,qint64,QStringList,numb,写法,cnNumWeight,cump
From: https://www.cnblogs.com/Paoyao/p/18160059

相关文章

  • 【Qt 专栏】文件对话框 文件的弹窗选择-QFileDialog
    前言:通过按钮实现文件弹窗选择以及关联的操作效果图就和平时用电脑弹出的选文件对话框一样原型图技能:头文件:#include<QFileDialog>//头文件QStringfilename=QFileDialog::getOpenFileName(this,"弹窗标题","E://","Images(*.png*.jpg)");弹出对话框选择文件 实......
  • 【Qt专栏】C++删除空指针
    简短不看版:最佳实践if(pMyClass) //这里,pMyClass是指向某个类的指针..{deletepMyClass;pMyClass=NULL; //这句不能少}  完全可以....可能有不少人对Delete删除空指针的用法不屑一顾,但在实际运用当中, 却有不少人会犯类似的错误,最典......
  • 【Qt 专栏】QString::arg()函数
    原文链接:https://blog.csdn.net/Gnar_w/article/details/134966919作者:Gnar_w  (CSDN) 一、说明在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(仅有些许类似)。二、使用有以下方式:使用arg(str1,str2,str3)这种方法进行替换。使用arg(str1).arg(str2).arg(......
  • qt封装dll并静态调用其它接口
    开发套件为QT5.9+MinGW编译器首先创建dll,第一步创建一个打开pro文件,因为我们创建的是app,需要的是dll,修改app->lib,注意不是dll其次,静态调用自己的底层库在工程中加入头文件,在pro添加dll的路径(注意这里静态调用没有用到lib文件)添加示例接口将编译的dll放入测试环境......
  • 【Qt 专栏】Qt:SQLite数据库操作示例
    转载自:https://blog.csdn.net/qq_40344790/article/details/129521573作者:DevFrank(CSDNC/C++ 优质创作者)1. sqlite介绍SQLite 是一种轻量级的嵌入式关系型数据库管理系统,它是一个开源的、零配置的、自包含的、事务性的SQL数据库引擎。SQLite的设计目标是简单、高效、可......
  • 【python】pyqt中使用多线程处理耗时任务
    在PyQt中使用多线程通常是为了避免界面冻结,特别是在执行耗时的任务时。PyQt本身是基于Qt的,而Qt不允许在除主线程之外的线程中直接操作GUI元素。因此,任何涉及GUI更新的操作都应该在主线程中执行。importsysimportthreadingfromPyQt5.QtWidgetsimportQApplic......
  • Qt 中多线程对应的信号槽
    Qt中通过moveToThread方式来实现的多线程之间数据交互一般是通过信号槽来进行的,信号槽不仅可以用于同一个线程中,也可以用于多线程之间,当用于多线程之间时,其连接方式为Qt::QueuedConnection,即队列连接。多线程之间建立的信号槽主要为如下两个:主线程发送信号:来触发子线程的......
  • Python GUI开发- Qt Designer环境搭建
    前言QtDesigner是PyQt5程序UI界面的实现工具,使用QtDesigner可以拖拽、点击完成GUI界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用环境准备使用pip安装pipinstallpyqt5-toolsQtDesigner环境搭建在pip安装包的路径中,找到designer.exe文件......
  • MASM中子程序(Procedures)的写法
      在MASM(MicrosoftMicroAssembler)的汇编体系中,子程序(Procedures)的定义和调用是非常重要的,就像C、pascal等的函数和方法一样;且对深入理解高级语言里函数的底层原理极其重要,如函数的参数传递、栈、变长参数等。但在网络上许多教程及代码都极其不规范且语焉不详;有的代码虽然......
  • 【Qt 专栏】QByteArray详解(QByteArray 与 QString的区别)
    本文转自:《Qt编程指南》    作者:奇先生Qt编程指南,Qt新手教程,QtProgrammingGuide本节学习QByteArray的两种用法,第一种作为字符串处理类,类似QString,但QByteArray内部字符编码不确定,所以要慎用。第二种是作为纯的字节数组,里面可以包含多个'\0',经常用于网络数据的......