阿拉伯数字到汉字:
把阿拉伯数组四个一组取出来,逐位向汉字转,在组内,数字转为汉字+权位。然后每个组间,添加权节位 和 0
1.只有当101这种形式,组内才需要添加“零”
2.多个连续的0只加一个“零”
上面两点用一个标记位可以实现,记录当前字符的上一个字符是不是0,只有当上一个字符不是0,且左侧还有非零(101形式),加一个“零”,因为连续的0会导致上一个字符为0,不会重复添加。
3.当本节小于一千(即最高位为0),且下一节不为0时,需要在节间添加0.
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
string chnNumChar[] = { "零","一","二","三","四","五","六","七","八","九" };
string chnUnitSection[] = { "","万","亿","万亿" };
string chnUnitChar[] = { "","十","百","千" };
//num == 0需要特殊处理,直接返回"零"
void SectionToChinese(unsigned int section, std::string& chnStr)
{
std::string strIns;
int unitPos = 0;
bool zero = true;
// cout << section << endl;
while (section > 0)
{
int v = section % 10;
if (v == 0)
{
if ((section != 0) && !zero)
{
// cout << section << " " << zero << endl;
zero = true; /*需要补,zero的作用是确保对连续的多个,只补一个中文零*/
chnStr = chnNumChar[v] + chnStr;
}
}
else
{
zero = false; //至少有一个数字不是
if (section != 1 || unitPos!=1)
strIns = chnNumChar[v]; //此位对应的中文数字
// cout << unitPos << endl;
strIns += chnUnitChar[unitPos]; //此位对应的中文权位
chnStr = strIns + chnStr;
}
strIns = "";
unitPos++; //移位
section = section / 10;
}
}
void NumberToChinese(unsigned int num, std::string& chnStr)
{
int unitPos = 0;
std::string strIns;
bool needZero = false;
while (num > 0)
{
unsigned int section = num % 10000;
if (needZero)
{
chnStr.insert(0, chnNumChar[0]);
}
SectionToChinese(section, strIns);
/*是否需要节权位? */
strIns += (section != 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
chnStr = strIns + chnStr;
/*千位是0需要在下一个section补零*/
needZero = (section < 1000) && (section > 0);
strIns = "";
num = num / 10000;
unitPos++;
}
}
int main()
{
int num;
while (cin >> num)
{
string ret;
NumberToChinese(num, ret);
cout << ret << endl;
}
return 0;
}
汉字到阿拉伯数字:
中文数字转阿拉伯数字(C++实现)
逐个汉字 向数字转。遇到汉字,转为数字,遇到“零”,跳过,遇到权位,将数字乘权位,暂存到节值里,遇到节权位,累加到最终结果。
#include<vector>
#include<iostream>
#include<algorithm>
#include<string>
#include<unordered_map>
#define CHN_CHAR_LENGTH 2
using namespace std;
typedef pair<int, bool> ib;
unordered_map<string, ib>jiequan = {
{"十",{10,false}},
{ "百",{100,false} },
{ "千",{1000,false} },
{ "万",{10000,true} },
{ "亿",{100000000,true} },
};
unordered_map<string, int>shuzi = {
{"一",1},
{"二",2},
{"三",3},
{"四",4},
{"五",5},
{"六",6},
{"七",7},
{"八",8},
{"九",9},
};
long long string2int(string s)
{
long long ret = 0;
int jienum = 0;
int num = 1;
Bool endquan=false; //判断到节权位时,上一个是 数字还是权位 如:五万和五十万,因为只有当遇到权位时,才会收集当前数字到节值里,防止漏掉最后一个
for (int i=0;i<s.size();i+=CHN_CHAR_LENGTH)
{
string t = s.substr(i, CHN_CHAR_LENGTH); //C++下string存取汉字的形式。WINDOWS是用utf-8,汉字是两个字节
if (shuzi.find(t) != shuzi.end()) //普通数字
{
num = shuzi[t];
endquan=false;
if (i>= s.size() - CHN_CHAR_LENGTH) //到结尾了
return ret + num + jienum;
}
else if(jiequan.find(t)!=jiequan.end())
{
if (jiequan[t].second) // 节权位
{
if(endquan)
ret += (jienum) * jiequan[t].first;
else
ret += (jienum+num) * jiequan[t].first;
jienum = 0;
num = 1;
}
else //权位
{
endquan=true;
jienum += num * jiequan[t].first;
num = 1;
}
if (i >= s.size() - CHN_CHAR_LENGTH) //到结尾了
return ret + jienum;
}
}
return ret;
}
int main()
{
string s;
while (cin >> s)
{
long long ret;
ret=string2int(s);
cout << ret << endl;
}
return 0;
}
参考:
http://data.biancheng.net/view/147.html