aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanielle Madeley <danielle.madeley@collabora.co.uk>2011-04-15 12:15:47 +0800
committerDanielle Madeley <danielle.madeley@collabora.co.uk>2011-04-15 12:15:47 +0800
commit86ae88ce9569ff1d198ea16b5f73103cc0d420b9 (patch)
tree9324fad41d4a6b66a628bed6db81788c445f35ee
parent5fc3d08d0a34b639f169e537f00fde363d296379 (diff)
downloadgsoc2013-empathy-86ae88ce9569ff1d198ea16b5f73103cc0d420b9.tar
gsoc2013-empathy-86ae88ce9569ff1d198ea16b5f73103cc0d420b9.tar.gz
gsoc2013-empathy-86ae88ce9569ff1d198ea16b5f73103cc0d420b9.tar.bz2
gsoc2013-empathy-86ae88ce9569ff1d198ea16b5f73103cc0d420b9.tar.lz
gsoc2013-empathy-86ae88ce9569ff1d198ea16b5f73103cc0d420b9.tar.xz
gsoc2013-empathy-86ae88ce9569ff1d198ea16b5f73103cc0d420b9.tar.zst
gsoc2013-empathy-86ae88ce9569ff1d198ea16b5f73103cc0d420b9.zip
Add method empathy_format_currency()
This method takes a Telepathy Currency_Amount and attempts to format it using currency rules appropriate for that amount. Unfortunately I haven't yet found a good summary of currency rules, so I've mostly been guessing. The currencies structure needs completing and checking.
-rw-r--r--libempathy/empathy-utils.c74
-rw-r--r--libempathy/empathy-utils.h2
2 files changed, 76 insertions, 0 deletions
diff --git a/libempathy/empathy-utils.c b/libempathy/empathy-utils.c
index bd150dac9..d14b47f26 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>
@@ -793,3 +794,76 @@ empathy_get_x509_certificate_hostname (gnutls_x509_crt_t cert)
return NULL;
}
+
+char *
+empathy_format_currency (int amount,
+ guint scale,
+ const char *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 */
+ static const struct {
+ const char *currency;
+ const char *positive;
+ const char *negative;
+ const char *decimal;
+ } currencies[] = {
+ { "EUR", EURO "%s", MINUS EURO "%s", "." },
+ { "USD", "$%s", MINUS "$%s", "." },
+ { "JPY", YEN "%s" MINUS YEN "%s", "." },
+ { "GBP", POUND "%s", MINUS POUND "%s", "." },
+ // { "PLN", "" },
+ // { "BRL", "" },
+ // { "SEK", "" },
+ // { "DKK", "" },
+ // { "HKD", "" },
+ // { "CHF", "" },
+ { "NOK", "%s kr", MINUS "%s kr", "." },
+ { "CAD", "$%s", MINUS "$%s", "." },
+ // { "TWD", "" },
+ { "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 2ddfb4c53..a29fe0106 100644
--- a/libempathy/empathy-utils.h
+++ b/libempathy/empathy-utils.h
@@ -102,6 +102,8 @@ gboolean empathy_folks_persona_is_interesting (FolksPersona *persona);
gchar * empathy_get_x509_certificate_hostname (gnutls_x509_crt_t cert);
+char *empathy_format_currency (int amount, guint scale, const char *currency);
+
G_END_DECLS
#endif /* __EMPATHY_UTILS_H__ */