处理数字用中文表示

处理将一串数字转换成中文表示。
譬如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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值