之前面试过程中碰到一道笔试题,要求将阿拉伯数字的金额转换成中文大写数字,类似发票上的写法。当时只是简单的将小数点之前的数字转换为汉字,并没有实现小数点之后的数字以及当数字中间出现多个0的情况。
现将完善后的代码记录下来,不足之处还望各位不吝赐教。
1 #include <iostream> 2 #include <string> 3 4 #include <math.h> 5 6 7 using namespace std; 8 9 const char *afterDecimals[] = { "圆","角","分" }; 10 const char *chineseNum[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; 11 const char *beforeDecimals[] = { "","拾","佰","仟"}; 12 const char *step[] = { "","万","亿","万","亿","万","亿" }; 13 14 bool isZero(long double num) 15 { 16 if (num > -0.0000001 && num < 0.0000001) 17 return true; 18 else 19 return false; 20 } 21 22 int getLength(long double num) 23 { 24 int length = 0; 25 26 //num零值判断 27 if (isZero(num)) 28 return 1; 29 else 30 { 31 /* 32 while ((long long)num) 33 { 34 length++; 35 num /= 10; 36 } 37 return length; 38 */ 39 return (int)(log10(num) + 1); 40 } 41 } 42 43 string change(long double num) 44 { 45 string str; 46 char buf[64] = { 0 }; 47 sprintf_s(buf, "%0.0f", (num*100)); 48 int bufLength = strlen(buf); 49 cout << "buf = " << buf << endl; 50 int length = getLength(num); 51 bool is0 = false; 52 53 //小数点之前 54 for (int i = 0; i < length; i++) 55 { 56 int j = buf[i] - '0'; 57 if (j == 0) 58 is0 = true; 59 else if (j > 0 && is0)//处理遇到连续多个0的情况 60 { 61 str += chineseNum[0] + string(chineseNum[j]) + beforeDecimals[(length - i - 1) % 4]; 62 is0 = false; 63 } 64 else 65 { 66 str += chineseNum[j]; 67 str += beforeDecimals[(length - i-1) % 4]; 68 } 69 if ((length - i-1) % 4 == 0) 70 { 71 str += step[(length - i-1) / 4]; 72 is0 = false; 73 } 74 } 75 76 77 //小数点以后 78 for (int i = 0; i < bufLength; i++) 79 { 80 char ch = buf[i]; 81 if (i >= length) 82 str += chineseNum[atoi(&ch)] + string(afterDecimals[i + 1 - length]); 83 84 else if (i == length-1) 85 str += string(afterDecimals[0]) + string("."); 86 else 87 continue; 88 } 89 return str; 90 } 91 92 int main(int argc, char* argv[]) 93 { 94 95 long double num = 123456789.236; 96 cout << "num = 123456789.236" << endl; 97 string str = change(num); 98 cout << str << endl; 99 100 101 102 getchar(); 103 return 0; 104 }
其中change(long double num)函数为主体,之所以采用long double类型是为了转换大于99999999的数字。