C++ – 阿拉伯数字字符串转换为中文读法的中文字符串,支持小数点
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – 阿拉伯数字字符串转换为中文读法的中文字符串,支持小数点
原文链接:https://www.stubbornhuang.com/1851/
发布于:2021年12月04日 18:40:01
修改于:2021年12月05日 11:05:11
1 C++阿拉伯数字字符串转换为中文读法的中文字符串,不支持小数点
最近碰到一个这样的需求,就是将阿拉伯数字字符串转换为中文读法的中文字符串,形如将
"199922"
转换为:
"十九万九千九百二十二"
经过一番折腾,已经可以成功完成转换,并支持个位数到兆的范围转换,我的示例代码如下:
#include <iostream>
#include <string>
std::wstring ConvertNumToChineseNum(const std::wstring& num)
{
std::wstring chinaeseNumResult;
std::wstring num_copy = num;
int size = num_copy.length();
for (int i = 0; i < num_copy.size(); ++i)
{
if (num_copy[i] == L'1')
{
chinaeseNumResult += L"一";
}
else if (num_copy[i] == L'2')
{
chinaeseNumResult += L"二";
}
else if (num_copy[i] == L'3')
{
chinaeseNumResult += L"三";
}
else if (num_copy[i] == L'4')
{
chinaeseNumResult += L"四";
}
else if (num_copy[i] == L'5')
{
chinaeseNumResult += L"五";
}
else if (num_copy[i] == L'6')
{
chinaeseNumResult += L"六";
}
else if (num_copy[i] == L'7')
{
chinaeseNumResult += L"七";
}
else if (num_copy[i] == L'8')
{
chinaeseNumResult += L"八";
}
else if (num_copy[i] == L'9')
{
chinaeseNumResult += L"九";
}
if (num_copy[i] == L'0')
{
if (size % 4 == 3)
{
if (num_copy[i + 1] != L'0' || num_copy[i + 2] != L'0')
{
chinaeseNumResult += L"零";
}
}
else if (size % 4 == 2 && num_copy[i - 1] != L'0')
{
if (num_copy[i + 1] != L'0')
{
chinaeseNumResult += L"零";
}
}
}
if (size % 4 == 1)
{
if (size / 4 == 1)
{
if (num_copy[i] != L'0' || num_copy[i - 1] != L'0' || num_copy[i - 2] != L'0' || num_copy[i - 3] != L'0')
{
chinaeseNumResult += L"万";
}
}
else if (size / 4 == 2)
{
if (num_copy[i] != L'0' || num_copy[i - 1] != L'0' || num_copy[i - 2] != L'0' || num_copy[i - 3] != L'0')
{
chinaeseNumResult += L"亿";
}
}
if (size / 4 == 3)
{
if (num_copy[i] != L'0' || num_copy[i - 1] != L'0' || num_copy[i - 2] != L'0' || num_copy[i - 3] != L'0')
{
chinaeseNumResult += L"兆";
}
}
}
if (num_copy[i] != L'0')
{
if (size % 4 == 2)
{
chinaeseNumResult += L"十";
}
if (size % 4 == 3)
{
chinaeseNumResult += L"百";
}
if (size % 4 == 0)
{
chinaeseNumResult += L"千";
}
}
--size;
}
return chinaeseNumResult;
}
int main()
{
std::wstring result = ConvertNumToChineseNum(L"352717183921");
std::wcout << result << std::endl;
return 0;
}
运行结果如下:
2 C++阿拉伯数字字符串转换为中文读法的中文字符串,支持小数点
形如将
"199922.99"
转换为:
"十九万九千九百二十二点九九"
示例代码如下:
#include <iostream>
#include <string>
// 将阿拉伯字符串的整数部分,即小数点前的部分转换为中文数字字符串
std::wstring ConverArabicNumIntegerPartToChineseNum(const std::wstring& arab_num_integer_part)
{
std::wstring chineseNumResult;
std::wstring arab_num_integer_part_copy = arab_num_integer_part;
int size = arab_num_integer_part_copy.length();
for (int i = 0; i < arab_num_integer_part_copy.size(); ++i)
{
if (arab_num_integer_part_copy[i] == L'1')
{
chineseNumResult += L"一";
}
else if (arab_num_integer_part_copy[i] == L'2')
{
chineseNumResult += L"二";
}
else if (arab_num_integer_part_copy[i] == L'3')
{
chineseNumResult += L"三";
}
else if (arab_num_integer_part_copy[i] == L'4')
{
chineseNumResult += L"四";
}
else if (arab_num_integer_part_copy[i] == L'5')
{
chineseNumResult += L"五";
}
else if (arab_num_integer_part_copy[i] == L'6')
{
chineseNumResult += L"六";
}
else if (arab_num_integer_part_copy[i] == L'7')
{
chineseNumResult += L"七";
}
else if (arab_num_integer_part_copy[i] == L'8')
{
chineseNumResult += L"八";
}
else if (arab_num_integer_part_copy[i] == L'9')
{
chineseNumResult += L"九";
}
if (arab_num_integer_part_copy[i] == L'0')
{
if (size % 4 == 3)
{
if (arab_num_integer_part_copy[i + 1] != L'0' || arab_num_integer_part_copy[i + 2] != L'0')
{
chineseNumResult += L"零";
}
}
else if (size % 4 == 2 && arab_num_integer_part_copy[i - 1] != L'0')
{
if (arab_num_integer_part_copy[i + 1] != L'0')
{
chineseNumResult += L"零";
}
}
}
if (size % 4 == 1)
{
if (size / 4 == 1)
{
if (arab_num_integer_part_copy[i] != L'0' || arab_num_integer_part_copy[i - 1] != L'0' || arab_num_integer_part_copy[i - 2] != L'0' || arab_num_integer_part_copy[i - 3] != L'0')
{
chineseNumResult += L"万";
}
}
else if (size / 4 == 2)
{
if (arab_num_integer_part_copy[i] != L'0' || arab_num_integer_part_copy[i - 1] != L'0' || arab_num_integer_part_copy[i - 2] != L'0' || arab_num_integer_part_copy[i - 3] != L'0')
{
chineseNumResult += L"亿";
}
}
if (size / 4 == 3)
{
if (arab_num_integer_part_copy[i] != L'0' || arab_num_integer_part_copy[i - 1] != L'0' || arab_num_integer_part_copy[i - 2] != L'0' || arab_num_integer_part_copy[i - 3] != L'0')
{
chineseNumResult += L"兆";
}
}
}
if (arab_num_integer_part_copy[i] != L'0')
{
if (size % 4 == 2)
{
chineseNumResult += L"十";
}
if (size % 4 == 3)
{
chineseNumResult += L"百";
}
if (size % 4 == 0)
{
chineseNumResult += L"千";
}
}
--size;
}
return chineseNumResult;
}
// 将阿拉伯字符串的小数部分,即小数点后的部分转换为中文数字字符串
std::wstring ConverArabicNumDecimalPartToChineseNum(const std::wstring& arab_num_decimal_part)
{
std::wstring chineseNumResult;
std::wstring arab_num_decimal_part_copy = arab_num_decimal_part;
for (int i = 0; i < arab_num_decimal_part_copy.size(); ++i)
{
if (arab_num_decimal_part_copy[i] == L'0')
{
chineseNumResult += L"零";
}
else if (arab_num_decimal_part_copy[i] == L'1')
{
chineseNumResult += L"一";
}
else if (arab_num_decimal_part_copy[i] == L'2')
{
chineseNumResult += L"二";
}
else if (arab_num_decimal_part_copy[i] == L'3')
{
chineseNumResult += L"三";
}
else if (arab_num_decimal_part_copy[i] == L'4')
{
chineseNumResult += L"四";
}
else if (arab_num_decimal_part_copy[i] == L'5')
{
chineseNumResult += L"五";
}
else if (arab_num_decimal_part_copy[i] == L'6')
{
chineseNumResult += L"六";
}
else if (arab_num_decimal_part_copy[i] == L'7')
{
chineseNumResult += L"七";
}
else if (arab_num_decimal_part_copy[i] == L'8')
{
chineseNumResult += L"八";
}
else if (arab_num_decimal_part_copy[i] == L'9')
{
chineseNumResult += L"九";
}
}
return chineseNumResult;
}
std::wstring ConvertArabicNumToChineseNum(const std::wstring& arab_num)
{
std::wstring chineseNumResult;
std::wstring arab_num_copy = arab_num;
// 如果包含了小数点
if (arab_num_copy.find(L".") != std::wstring::npos)
{
int dotPosition = arab_num_copy.find(L".");
std::wstring integerPartNum = arab_num_copy.substr(0, dotPosition);
std::wstring decimalPartNum = arab_num_copy.substr(dotPosition + 1);
chineseNumResult += ConverArabicNumIntegerPartToChineseNum(integerPartNum);
chineseNumResult += L"点";
chineseNumResult += ConverArabicNumDecimalPartToChineseNum(decimalPartNum);
}
else
{
chineseNumResult += ConverArabicNumIntegerPartToChineseNum(arab_num_copy);
}
return chineseNumResult;
}
int main()
{
std::wstring result = ConvertArabicNumToChineseNum(L"131346546511.99");
std::wcout << result << std::endl;
return 0;
}
当前分类随机文章推荐
- C++ - 使用ffmpeg读取视频旋转角度并使用OpenCV根据旋转角度对视频进行旋转复原 阅读1881次,点赞0次
- C++ - Windows获取电脑上摄像头设备数目、名字以及id 阅读447次,点赞0次
- C++ - 动态链接库dll为什么要使用unsigned char作为byte的内部格式 阅读728次,点赞0次
- C++ - 导出接口函数和导出C++类 阅读384次,点赞0次
- 计算几何 - C++计算两个二维向量的夹角 阅读4325次,点赞3次
- C++ - C++类的特殊成员函数,析构函数,拷贝构造函数,移动构造函数,赋值运算符,移动赋值运算符介绍和基础语法 阅读880次,点赞0次
- C++ - Map中存储动态指针时正确释放内存 阅读3872次,点赞0次
- C++ - std::string替换字符串中所有指定的子字符串 阅读2843次,点赞1次
- C++ 回调函数 阅读3036次,点赞0次
- C++11 - 解析并获取可变参数模板中的所有参数 阅读1302次,点赞0次
全站随机文章推荐
- ThreeJS - 修复摄像机近距离模型或者摄像机在某些观察角度3D模型部分或者全部不可见的问题 阅读526次,点赞1次
- 资源分享 - 鸟哥的Linux私房菜-基础学习篇(第四版)带书签PDF下载 阅读3041次,点赞0次
- WordPress - get_sidebar函数,加载主题侧边栏模板 阅读935次,点赞0次
- Modern OpenGL - GLSL着色语言2:GLSL入口函数和GLSL中的变量 阅读2793次,点赞0次
- ThreeJS - 使用Hdr环境贴图作为间接光照对模型进行渲染 阅读1726次,点赞3次
- C++ - 使用C++标准库过滤Windows文件名中的非法字符 阅读4596次,点赞1次
- C++ - 获取std::vector中的最小值、最大值以及对应的索引 阅读224次,点赞0次
- WordPress - 在文章页顶部加入百分比阅读滚动进度条 阅读954次,点赞2次
- Python - 字典dict遍历方法总结 阅读653次,点赞0次
- 资源分享 - Production Volume Rendering - Design and Implementation 英文高清PDF下载 阅读2116次,点赞0次
评论
169