你是否在寻找类似这样的东西?它并不是一个完整的解决方案,因为它将货币处理外部化。此外,它对负数无效。
只需分配一个字符缓冲区并调用
write_number
即可。第三个和第四个参数应该是货币单位(以复数形式),例如“美元”和“美分”。 (单数情况尚未得到妥善处理。)
#include <math.h>
#include <string.h>
const char* SMALL_NUMBERS[] = {
0, "one ", "two ", "three ", "four ",
"five ", "six ", "seven ", "eight ", "nine ",
"ten ", "eleven ", "twelve ", "thirteen ", "fourteen ",
"fiftenn ", "sixteen ", "seventeen ", "eighteen ", "nineteen "
};
const char* TENS[] = {
0, 0, "twenty ", "thirty ", "forty ",
"fifty ", "sixty ", "seventy ", "eighty ", "ninety "
};
void append_lt_1000(char* buf, int num)
{
if (num >= 100) {
strcat(buf, SMALL_NUMBERS[num / 100]);
strcat(buf, "hundred ");
num %= 100;
}
if (num >= 20) {
strcat(buf, TENS[num / 10]);
num %= 10;
}
if (num != 0)
strcat(buf, SMALL_NUMBERS[num]);
}
void append_mag(char* buf, double* number, double magnitude, const char* mag_name)
{
if (*number < magnitude)
return;
append_lt_1000(buf, (int)(*number / magnitude));
strcat(buf, mag_name);
*number = fmod(*number, magnitude);
}
void write_number(char* buf, double number, const char* major_unit, const char* minor_unit)
{
double ip, fp;
buf[0] = 0;
fp = modf(number, &ip);
if (ip == 0) {
strcat(buf, "zero ");
} else {
append_mag(buf, &ip, 1000000000000.0, "trillion ");
append_mag(buf, &ip, 1000000000.0, "billion ");
append_mag(buf, &ip, 1000000, "million ");
append_mag(buf, &ip, 1000, "thousand ");
append_lt_1000(buf, (int)ip);
}
strcat(buf, major_unit);
if (fp != 0) {
strcat(buf, " and ");
append_lt_1000(buf, (int)(fp * 100));
strcat(buf, minor_unit);
}
}