数字转中文

将一个千亿之内的数转换成中文,可以包含小数

思路:对于存在小数的情况下,拆分出来整数部分和小数部分。

关键是整数部分。以4位分隔作为一小节

对于节内的转换处理

  • 0时,是不输出单位的

  • 连续0时只输出一个

对于节间的处理

  • 如果当前节小于1000,并且前面还存在节时,需要补上0

  • 当前节等于0时,不输出

代码如下:

class NumToChinese
{
public:
    string convert(const string& strNum)
    {
        int num = 0;
        string:size_t pos = strNum.find(".");
        if (pos != string::npos) {
            num = stoi(strNum.substr(0, pos));
        } else {
            num = stoi(strNum);
        }

        string ans;
        bool needZero = false;
        int curPos = 0;
        while (num > 0) {
            int section = num % 10000;

            if (needZero) {
                ans.insert(0, numChars[0]);
            }
            string sectionStr = convertSection(section);
            if (section) {
                sectionStr += bigUnits[curPos];
            }

            ans.insert(0, sectionStr);

            needZero = (section > 0 && section < 1000);

            num /= 10000;
            ++curPos;
        }

        if (pos != string::npos) {
            ans.append("点");

            for (size_t i = pos + 1; i < strNum.size(); i++) {
                ans.append(numChars[strNum[i] - '0']);
            }
        }

        return ans;
    }

private:
    string convertSection(int num)
    {
        string ans;
        bool zero = true;

        int pos = 0;
        while (num > 0) {
            int cur = num % 10;
            if (cur == 0) {
                if (!zero) {
                    zero = true;
                    ans.insert(0, numChars[cur]);
                }
            } else {
                zero = false;
                string tmp = numChars[cur];
                tmp += units[pos];
                ans.insert(0, tmp);
            }
            num /= 10;
            ++pos;
        }

        return ans;
    }

    vector<string> units{"", "十", "百", "千"};
    vector<string> bigUnits{"", "万", "亿"};
    vector<string> numChars{"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值