免费的跨平台库,用于将数字(货币金额)转换为文字?

9
我正在寻找一个跨平台库,可以在我的C应用程序中使用,将货币金额(例如$123.50)转换为文字(一百二十三美元五十美分)。我需要支持多种货币:美元、欧元、英镑等。
虽然我知道自己编写实现并不难,但我想避免重复造轮子。我已经尝试过谷歌搜索,但与MS Word转换器相关的噪音太多。
有人能推荐一些东西吗?
更新:许多评论建议自己编写实现,因为这是非常容易的任务。我同意。我的观点是同时支持多种货币和不同的业务规则来拼写金额(小数部分应该写成文本还是数字等)。据我所知,严肃的商业应用程序内置了这样的库,但我认为没有开源可用,也许因为它看起来非常容易。
我打算编写自己的库,然后开源它。感谢大家。

1
我会感到惊讶,因为这个问题实际上非常简单。事实上,它可以作为一道相当不错的计算机科学作业题目... - T.E.D.
@bialix:我在谷歌搜索中没有找到任何相关内容。R..提出了一个很好的观点。有支票书写软件,但是字符串应该是“一百二十三点五十美分”。我猜你可能需要编写自己的转换函数。 - Gilbert Le Blanc
1
如果您只支持固定最大值,那么这是一个非常有限的问题。只需枚举所有情况并处理它们即可。只有当您支持高达 Google 和 Googleplex 的 bignum 值时,才会变得困难。 "请支付 1 Googleplex 美元五十美分,谢谢。" :-) - R.. GitHub STOP HELPING ICE
在英国,支票上的字符串将是“一百二十三英镑五十便士” - 因此它实际上不只是一个数字。 - mmmmmm
1
我强烈建议与一些大学生交谈。这通常是入门语言课程的作业。 - Thomas Matthews
显示剩余6条评论
2个回答

4

ICU正好有这个功能,并提供API来构建自己的数字转文字和拼写规则。请参见这里


1
你是否在寻找类似这样的东西?它并不是一个完整的解决方案,因为它将货币处理外部化。此外,它对负数无效。
只需分配一个字符缓冲区并调用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);
    }
}

谢谢你提供的代码示例。正如我在原问题中所说,编写自己的实现并不复杂,我更关心货币和单复数处理。无论如何还是非常感谢。 - bialix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接