diff options
author | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-05-05 16:30:33 +0800 |
---|---|---|
committer | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-05-05 16:30:33 +0800 |
commit | 822b3b6e0a5d781cbe0ff024eed6c8b8dace6526 (patch) | |
tree | cb0a8edb20269ab61ac5f4f7dcd2c8c5f2da6878 /libempathy | |
parent | c698741b1825e306de447fa09624f4a93f067374 (diff) | |
parent | 90d1301153a574f9d3ac986783efa6b96ebb2f57 (diff) | |
download | gsoc2013-empathy-822b3b6e0a5d781cbe0ff024eed6c8b8dace6526.tar gsoc2013-empathy-822b3b6e0a5d781cbe0ff024eed6c8b8dace6526.tar.gz gsoc2013-empathy-822b3b6e0a5d781cbe0ff024eed6c8b8dace6526.tar.bz2 gsoc2013-empathy-822b3b6e0a5d781cbe0ff024eed6c8b8dace6526.tar.lz gsoc2013-empathy-822b3b6e0a5d781cbe0ff024eed6c8b8dace6526.tar.xz gsoc2013-empathy-822b3b6e0a5d781cbe0ff024eed6c8b8dace6526.tar.zst gsoc2013-empathy-822b3b6e0a5d781cbe0ff024eed6c8b8dace6526.zip |
Merge branch 'balance-rebase'
Diffstat (limited to 'libempathy')
-rw-r--r-- | libempathy/empathy-utils.c | 75 | ||||
-rw-r--r-- | libempathy/empathy-utils.h | 2 |
2 files changed, 77 insertions, 0 deletions
diff --git a/libempathy/empathy-utils.c b/libempathy/empathy-utils.c index f8220ac31..8173f781d 100644 --- a/libempathy/empathy-utils.c +++ b/libempathy/empathy-utils.c @@ -29,6 +29,7 @@ #include "config.h" #include <string.h> +#include <math.h> #include <time.h> #include <sys/types.h> @@ -957,3 +958,77 @@ empathy_get_x509_certificate_hostname (gnutls_x509_crt_t cert) return NULL; } + +gchar * +empathy_format_currency (gint amount, + guint scale, + const gchar *currency) +{ +#define MINUS "\342\210\222" +#define EURO "\342\202\254" +#define YEN "\302\245" +#define POUND "\302\243" + + /* localised representations of currency */ + /* FIXME: check these, especially negatives and decimals */ + static const struct { + const char *currency; + const char *positive; + const char *negative; + const char *decimal; + } currencies[] = { + /* sym positive negative decimal */ + { "EUR", EURO "%s", MINUS EURO "%s", "." }, + { "USD", "$%s", MINUS "$%s", "." }, + { "JPY", YEN "%s" MINUS YEN "%s", "." }, + { "GBP", POUND "%s", MINUS POUND "%s", "." }, + { "PLN", "%s zl", MINUS "%s zl", "." }, + { "BRL", "R$%s", MINUS "R$%s", "." }, + { "SEK", "%s kr", MINUS "%s kr", "." }, + { "DKK", "kr %s", "kr " MINUS "%s", "." }, + { "HKD", "$%s", MINUS "$%s", "." }, + { "CHF", "%s Fr.", MINUS "%s Fr.", "." }, + { "NOK", "kr %s", "kr" MINUS "%s", "," }, + { "CAD", "$%s", MINUS "$%s", "." }, + { "TWD", "$%s", MINUS "$%s", "." }, + { "AUD", "$%s", MINUS "$%s", "." }, + }; + + const char *positive = "%s"; + const char *negative = MINUS "%s"; + const char *decimal = "."; + char *fmt_amount, *money; + guint i; + + /* get the localised currency format */ + for (i = 0; i < G_N_ELEMENTS (currencies); i++) { + if (!tp_strdiff (currency, currencies[i].currency)) { + positive = currencies[i].positive; + negative = currencies[i].negative; + decimal = currencies[i].decimal; + break; + } + } + + /* format the amount using the scale */ + if (scale == 0) { + /* no decimal point required */ + fmt_amount = g_strdup_printf ("%d", amount); + } else { + /* don't use floating point arithmatic, it's noisy; + * we take the absolute values, because we want the minus + * sign to appear before the $ */ + int divisor = pow (10, scale); + int dollars = abs (amount / divisor); + int cents = abs (amount % divisor); + + fmt_amount = g_strdup_printf ("%d%s%0*d", + dollars, decimal, scale, cents); + } + + money = g_strdup_printf (amount < 0 ? negative : positive, fmt_amount); + g_free (fmt_amount); + + return money; +} + diff --git a/libempathy/empathy-utils.h b/libempathy/empathy-utils.h index de879021e..ac44535b8 100644 --- a/libempathy/empathy-utils.h +++ b/libempathy/empathy-utils.h @@ -117,6 +117,8 @@ gboolean empathy_folks_persona_is_interesting (FolksPersona *persona); gchar * empathy_get_x509_certificate_hostname (gnutls_x509_crt_t cert); +gchar *empathy_format_currency (gint amount, guint scale, const gchar *currency); + /* Copied from wocky/wocky-utils.h */ #define empathy_implement_finish_void(source, tag) \ |