处理将一串数字转换成中文表示。
譬如1001,中文:一千零一。10100:一万零一百。
实现代码:
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <array>
#include <cmath>
#include <string>
#include <Windows.h>
std::array<std::wstring,3> arr_unit2 = { L"十",L"百",L"千"};
std::array<std::wstring, 10> arr_num_chinese = { L"零",L"一",L"二",L"三",L"四",L"五",L"六",L"七",L"八",L"九"};
std::wstring GetUnitFlag(int deep)
{
static std::array<std::wstring, 3> arr_unit = { L"万",L"亿",L"兆" };
return deep < 3 ? arr_unit[deep] : arr_unit[deep - 3] + L"兆";
}
std::wstring NumToChinese(UINT64 num,int deep)
{
if (num < std::pow(10.0, 4.0))
{
UINT64 merchant = num;
std::wstring result; //保存每4位数得结果
int power = 3; //幂(指数)
do
{
UINT64 remainder = merchant / (int)std::pow(10, power);
int pos = result.rfind(L'零');
int len = result.length();
if (remainder == 0 && (result.length() > 0 && pos == len - 1))
{
//处理连续得“零”,防止出现 “零零..” 这种情况
}
else
{
result += arr_num_chinese[remainder];
}
if (remainder > 0 && power > 0)
{
//非个位数,防止出现零十,零百
result += arr_unit2[power-1];
}
merchant = merchant % (int)std::pow(10, power);
power--;
} while (merchant > 0);
std::wstring str_unit;
if (deep>0)
{
//deep > 0 代表非最基本得 千 百。(大于10000)
if (result != L"零")
{
//这个4位结果全是零 就不带单位了,不能出现 "一亿零万" 这种情况。
str_unit = GetUnitFlag(deep - 1);
}
}
else
{
//最低得四位 全是0000 不显示。
if (result == L"零")
{
result = L"";
}
}
return result + str_unit;
}
else
{
UINT64 remainder = num % (int)std::pow(10.0, 4.0);
UINT64 merchant = num / (int)std::pow(10.0, 4.0);
return NumToChinese(merchant, ++deep) + NumToChinese(remainder, deep);
}
}
int main()
{
setlocale(LC_ALL, "chs");
std::wstring result = NumToChinese(1010025410010, 0);
//去除头部得零
while (result.find(L'零') == 0)
{
result = result.substr(1);
}
std::wcout << result << std::endl;
}