用C++实现:随便输入一个数(包括小数),(1)转化为中文大写(2)转化为人民币大写

如题所述

第一次写那么臃肿的代码,我昏:

#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <ctime>
using namespace std;

string chs(const string& in)
{
typedef unsigned size_t;
string chs[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
string digits[] =
{
"十", "百", "千", "万",
"十", "百", "千", "亿",
"十", "百", "千", "兆",
"十", "百", "千", "京",
"十", "百", "千", "垓",
"十", "百", "千", "秭",
"十", "百", "千", "穰",
"十", "百", "千", "沟",
"十", "百", "千", "涧",
"十", "百", "千", "正",
"十", "百", "千", "载",
"十", "百", "千", "报"
};

string value(in);
string VALUE;

if(value.find('.') == string::npos)
{
if(value.size() % 4 == 2 && value[0] == '1')
{
value.erase(0, 1);
VALUE.append("十");
}
string temp;
for(size_t i = 0; i < value.size(); ++i)
{
if(i != 0 && i != value.size() && temp != chs[static_cast<int>(value[i] - '0')])
{
string temp1(VALUE, VALUE.size() - 2, 2);
if(temp1 != string("零"))
VALUE.append(digits[value.size() - i - 1]);
}
if(temp != chs[static_cast<int>(value[i] - '0')])
{
VALUE.append(chs[static_cast<int>(value[i] - '0')]);
if(temp == string("零"))
temp = chs[static_cast<int>(value[i] - '0')];
}
}
}
else
{
string decimal(value.begin(), value.begin() + value.find('.'));
string fraction(value.begin() + value.find('.') + 1, value.end());
if(decimal.size() == 2 && decimal[0] == '1')
{
decimal.erase(0, 1);
VALUE.append("十");
}
string temp;
for(size_t i = 0; i < decimal.size(); ++i)
{
if(i != 0 && i != decimal.size() && temp != chs[static_cast<int>(value[i] - '0')])
{
string temp1(VALUE, VALUE.size() - 2, 2);
if(temp1 != string("零"))
VALUE.append(digits[decimal.size() - i - 1]);
}
if(temp != chs[static_cast<int>(decimal[i] - '0')])
{
VALUE.append(chs[static_cast<int>(decimal[i] - '0')]);
if(temp == string("零"))
temp = chs[static_cast<int>(decimal[i] - '0')];
}
}
string temp1(VALUE, VALUE.size() - 2, 2);
if(temp1 == "零")
VALUE.erase(VALUE.size() - 2, 2);
VALUE += "点";
for(size_t i = 0; i < fraction.size(); ++i)
{
VALUE.append(chs[static_cast<int>(fraction[i] - '0')]);
}
}
return VALUE;
}

string chRmb(const string& in)
{
typedef unsigned size_t;
string chs[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
string digits[] =
{
"拾", "佰", "仟", "万",
"拾", "佰", "仟", "亿",
"拾", "佰", "仟", "兆",
"拾", "佰", "仟", "京",
"拾", "佰", "仟", "垓",
"拾", "佰", "仟", "秭",
"拾", "佰", "仟", "穰",
"拾", "佰", "仟", "沟",
"拾", "佰", "仟", "涧",
"拾", "佰", "仟", "正",
"拾", "佰", "仟", "载",
"拾", "百", "仟", "报"
};
string frac[] = {"角", "分", "厘", "毫"};

string value(in);
string VALUE;

if(value.find('.') == string::npos)
{
if(value.size() % 4 == 2 && value[0] == '1')
{
value.erase(0, 1);
VALUE.append("拾");
}
string temp;
for(size_t i = 0; i < value.size(); ++i)
{
if(i != 0 && i != value.size() && temp != chs[static_cast<int>(value[i] - '0')])
{
string temp1(VALUE, VALUE.size() - 2, 2);
if(temp1 != string("零"))
VALUE.append(digits[value.size() - i - 1]);
}
if(temp != chs[static_cast<int>(value[i] - '0')])
{
VALUE.append(chs[static_cast<int>(value[i] - '0')]);
if(temp == string("零"))
temp = chs[static_cast<int>(value[i] - '0')];
}
}
}
else
{
string decimal(value.begin(), value.begin() + value.find('.'));
string fraction(value.begin() + value.find('.') + 1, value.end());
if(decimal.size() % 4 == 2 && decimal[0] == '1')
{
decimal.erase(0, 1);
VALUE.append("拾");
}
string temp;
for(size_t i = 0; i < decimal.size(); ++i)
{
if(i != 0 && i != decimal.size() && temp != string(chs[static_cast<int>(value[i] - '0')]))
{
string temp1(VALUE, VALUE.size() - 2, 2);
if(temp1 != string("零"))
VALUE.append(digits[decimal.size() - i - 1]);
}
if(temp != chs[static_cast<int>(decimal[i] - '0')])
{
VALUE.append(chs[static_cast<int>(decimal[i] - '0')]);
if(temp == string("零"))
temp = chs[static_cast<int>(decimal[i] - '0')];
}
}
string temp1(VALUE, VALUE.size() - 2, 2);
if(temp1 == "零")
VALUE.erase(VALUE.size() - 2, 2);
VALUE += "元";
for(size_t i = 0; i < fraction.size(); ++i)
{
VALUE.append(chs[static_cast<int>(fraction[i] - '0')]);
if(i != fraction.size() - 1)
VALUE.append(frac[i]);
}
}
return VALUE;
}

template<class T, class U>
T lexical_cast(U u)
{
stringstream sstrm;
sstrm << u;
T t;
sstrm >> t;
return t;
}

int main()
{
srand((unsigned)time(0));

for(int i = 0; i < 100; ++i)
{
string val = lexical_cast<string>(i * (rand() % 100000) * (rand() % 10 * 0.001));

cout << val << ":" << '\n';
cout << "大写 : " << chs(val) << '\n';
cout << "人民币: " << chRmb(val) << '\n' << endl;
}

cout << chs(string("8769123456789123456789123456789123456789123456789.123456789")) << endl;
cout << chRmb(string("8769123456789123456789123456789123456789123456789.12345")) << endl;
}

测试:

1346.83:
大写 : 一千三百四十六点八三
人民币: 壹仟叁佰肆拾陆元捌角叁

4975.51:
大写 : 四千九百七十五点五一
人民币: 肆仟玖佰柒拾伍元伍角壹

229.768:
大写 : 二百二十九点七六八
人民币: 贰佰贰拾玖元柒角陆分捌

709.108:
大写 : 七百零九点一零八
人民币: 柒佰零玖元壹角零分捌

0:
大写 : 零
人民币: 零

3408.64:
大写 : 三千四百零八点六四
人民币: 叁仟肆佰零捌元陆角肆

999.168:
大写 : 九百九十九点一六八
人民币: 玖佰玖拾玖元壹角陆分捌

1937.93:
大写 : 一千九百三十七点九三
人民币: 壹仟玖佰叁拾柒元玖角叁

1459.55:
大写 : 一千四百五十九点五五
人民币: 壹仟肆佰伍拾玖元伍角伍

643.965:
大写 : 六百四十三点九六五
人民币: 陆佰肆拾叁元玖角陆分伍

8138.56:
大写 : 八千一百三十八点五六
人民币: 捌仟壹佰叁拾捌元伍角陆

1851.18:
大写 : 一千八百五十一点一八
人民币: 壹仟捌佰伍拾壹元壹角捌

10894.1:
大写 : 一万零八百九十四点一
人民币: 壹万零捌佰玖拾肆元壹

3580.43:
大写 : 三千五百八十点四三
人民币: 叁仟伍佰捌拾元肆角叁

10202.8:
大写 : 一万零二百零二点八
人民币: 壹万零贰佰零贰元捌

1857.05:
大写 : 一千八百五十七点零五
人民币: 壹仟捌佰伍拾柒元零角伍

0:
大写 : 零
人民币: 零

6364.95:
大写 : 六千三百六十四点九五
人民币: 陆仟叁佰陆拾肆元玖角伍

6422.24:
大写 : 六千四百二十二点二四
人民币: 陆仟肆佰贰拾贰元贰角肆

3198.01:
大写 : 三千一百九十八点零一
人民币: 叁仟壹佰玖拾捌元零角壹

3182.1:
大写 : 三千一百八十二点一
人民币: 叁仟壹佰捌拾贰元壹

8802.07:
大写 : 八千八百零二点零七
人民币: 捌仟捌佰零贰元零角柒

1757.28:
大写 : 一千七百五十七点二八
人民币: 壹仟柒佰伍拾柒元贰角捌

868.035:
大写 : 八百六十八点零三五
人民币: 捌佰陆拾捌元零角叁分伍

1017.5:
大写 : 一千零一十七点五
人民币: 壹仟零壹拾柒元伍

855.423:
大写 : 八百五十五点四二三
人民币: 捌佰伍拾伍元肆角贰分叁

782.86:
大写 : 七百八十二点八六
人民币: 柒佰捌拾贰元捌角陆

608.705:
大写 : 六百零八点七零五
人民币: 陆佰零捌元柒角零分伍

2873.88:
大写 : 二千八百七十三点八八
人民币: 贰仟捌佰柒拾叁元捌角捌

4847.04:
大写 : 四千八百四十七点零四
人民币: 肆仟捌佰肆拾柒元零角肆

9339.12:
大写 : 九千三百三十九点一二
人民币: 玖仟叁佰叁拾玖元壹角贰

3469.42:
大写 : 三千四百六十九点四二
人民币: 叁仟肆佰陆拾玖元肆角贰

518.404:
大写 : 五百一十八点四零四
人民币: 伍佰壹拾捌元肆角零分肆

8476.53:
大写 : 八千四百七十六点五三
人民币: 捌仟肆佰柒拾陆元伍角叁

4435.2:
大写 : 四千四百三十五点二
人民币: 肆仟肆佰叁拾伍元贰

4175.33:
大写 : 四千一百七十五点三三
人民币: 肆仟壹佰柒拾伍元叁角叁

11130.4:
大写 : 一万一千一百三十点四
人民币: 壹万壹仟壹佰叁拾元肆

3817.8:
大写 : 三千八百一十七点八
人民币: 叁仟捌佰壹拾柒元捌

6493.76:
大写 : 六千四百九十三点七六
人民币: 陆仟肆佰玖拾叁元柒角陆

9686.3:
大写 : 九千六百八十六点三
人民币: 玖仟陆佰捌拾陆元叁

870.276:
大写 : 八百七十点二七六
人民币: 捌佰柒拾元贰角柒分陆

3120.12:
大写 : 三千一百二十点一二
人民币: 叁仟壹佰贰拾元壹角贰

7637.76:
大写 : 七千六百三十七点七六
人民币: 柒仟陆佰叁拾柒元柒角陆

10891.5:
大写 : 一万零八百九十一点五
人民币: 壹万零捌佰玖拾壹元伍

7922.25:
大写 : 七千九百二十二点二五
人民币: 柒仟玖佰贰拾贰元贰角伍

2122.05:
大写 : 二千一百二十二点零五
人民币: 贰仟壹佰贰拾贰元零角伍

1827.65:
大写 : 一千八百二十七点六五
人民币: 壹仟捌佰贰拾柒元陆角伍

2192.7:
大写 : 二千一百九十二点七
人民币: 贰仟壹佰玖拾贰元柒

633.588:
大写 : 六百三十三点五八八
人民币: 陆佰叁拾叁元伍角捌分捌

3333.45:
大写 : 三千三百三十三点四五
人民币: 叁仟叁佰叁拾叁元肆角伍

3104.45:
大写 : 三千一百零四点四五
人民币: 叁仟壹佰零肆元肆角伍

20018.7:
大写 : 二万零零一十八点七
人民币: 贰万零零壹拾捌元柒

914.16:
大写 : 九百一十四点一六
人民币: 玖佰壹拾肆元壹角陆

8619.85:
大写 : 八千六百一十九点八五
人民币: 捌仟陆佰壹拾玖元捌角伍

9418.56:
大写 : 九千四百一十八点五六
人民币: 玖仟肆佰壹拾捌元伍角陆

5793.61:
大写 : 五千七百九十三点六一
人民币: 伍仟柒佰玖拾叁元陆角壹

0:
大写 : 零
人民币: 零

0:
大写 : 零
人民币: 零

2437.76:
大写 : 二千四百三十七点七六
人民币: 贰仟肆佰叁拾柒元柒角陆

8439.65:
大写 : 八千四百三十九点六五
人民币: 捌仟肆佰叁拾玖元陆角伍

1704.86:
大写 : 一千七百零四点八六
人民币: 壹仟柒佰零肆元捌角陆

1704.5:
大写 : 一千七百零四点五
人民币: 壹仟柒佰零肆元伍

13277.4:
大写 : 一万三千二百七十七点四
人民币: 壹万叁仟贰佰柒拾柒元肆

17714.1:
大写 : 一万七千七百一十四点一
人民币: 壹万柒仟柒佰壹拾肆元壹

244.8:
大写 : 二百四十四点八
人民币: 贰佰肆拾肆元捌

0:
大写 : 零
人民币: 零

8986.56:
大写 : 八千九百八十六点五六
人民币: 捌仟玖佰捌拾陆元伍角陆

7797.12:
大写 : 七千七百九十七点一二
人民币: 柒仟柒佰玖拾柒元壹角贰

14659.6:
大写 : 一万四千六百五十九点六
人民币: 壹万肆仟陆佰伍拾玖元陆

4953.59:
大写 : 四千九百五十三点五九
人民币: 肆仟玖佰伍拾叁元伍角玖

16352.6:
大写 : 一万六千三百五十二点六
人民币: 壹万陆仟叁佰伍拾贰元陆

7079.45:
大写 : 七千零七十九点四五
人民币: 柒仟零柒拾玖元肆角伍

23194:
大写 : 二万三千一百九十四
人民币: 贰万叁仟壹佰玖拾肆

2985.44:
大写 : 二千九百八十五点四四
人民币: 贰仟玖佰捌拾伍元肆角肆

八报七千六百九十一载二千三百四十五正六千七百八十九涧一千二百三十四沟五千六百七十八穰九千一百二十三秭四千五百六十七垓八千九百一十二京三千四百五十六兆七千八百九十一亿二千三百四十五万六千七百八十九点一二三四五六七八九

捌报柒仟陆百玖拾壹载贰仟叁佰肆拾伍正陆仟柒佰捌拾玖涧壹仟贰佰叁拾肆沟伍仟陆佰柒拾捌穰玖仟壹佰贰拾叁秭肆仟伍佰陆拾柒垓捌仟玖佰壹拾贰京叁仟肆佰伍拾陆兆柒仟捌佰玖拾壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分叁厘肆毫伍
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-03-23
前两天做发票录入的时候用的 VB写的 转成C++应该不是太难吧

Function rmb(num)

num = FormatNumber(num, 2)
Dim numList As String
Dim rmbList As String
Dim numLen
Dim numChar
Dim numstr
Dim n
Dim n1, n2
Dim hz
numList = "零壹贰叁肆伍陆柒捌玖"
rmbList = "分角元拾佰仟万拾佰仟亿拾佰仟万"
If num > 9999999999999.99 Then
rmb = 超出范围的人民币值
Exit Function
End If

numstr = CStr(num * 100)
numLen = Len(numstr)
n = 1
Do While n <= numLen
numChar = CInt(Mid(numstr, n, 1))
n1 = Mid(numList, numChar + 1, 1)
n2 = Mid(rmbList, numLen - n + 1, 1)
If Not n1 = 零 Then
hz = hz + CStr(n1) + CStr(n2)
Else
If n2 = 亿 Or n2 = 万 Or n2 = 元 Or n1 = 零 Then
Do While Right(hz, 1) = 零
hz = Left(hz, Len(hz) - 1)
Loop
End If
If (n2 = 亿 Or (n2 = 万 And Right(hz, 1) <> 亿) Or n2 = 元) Then
hz = hz + CStr(n2)
Else
If Left(Right(hz, 2), 1) = 零 Or Right(hz, 1) <> 亿 Then
hz = hz + n1
End If
End If
End If
n = n + 1
Loop
Do While Right(hz, 1) = 零
hz = Left(hz, Len(hz) - 1)
Loop
If Right(hz, 1) = 元 Then
hz = hz + 整
End If
rmb = hz
End Function
第2个回答  2007-03-23
思路:
用字符串保存输入的数
然后用switch语句输出;
例子:
switch(ch)
{
case '1':
cout << "一";
break;
case '.'
cout << "点";
break;
.........

}
第3个回答  2007-03-23
随便输入:
int x;
x=arand()100% (a-b);