Index: goffice/utils/formats.c
===================================================================
--- goffice/utils/formats.c	(revision 2239)
+++ goffice/utils/formats.c	(working copy)
@@ -183,7 +183,34 @@
 	gboolean precedes, space_sep;
 	char const *curr = go_locale_get_currency (&precedes, &space_sep)->str;
 	char *pre, *post, *pre_rep, *post_rep;
+	char const *pos_sign_pre, *pos_sign_post, *neg_sign_pre, *neg_sign_post;
 
+	struct lconv *lc = localeconv ();
+
+	switch (lc->p_sign_posn) {
+	case 1: /* The sign string precedes the quantity and currency_symbol. */
+	case 3: /* The sign string immediately precedes the currency_symbol.  */
+		pos_sign_pre  = "_\xe2\x88\x92";
+		pos_sign_post = "_\xe2\x88\x92";
+		neg_sign_pre  = "\"\xe2\x88\x92\"";
+		neg_sign_post = "_\xe2\x88\x92";
+		break;
+	case 2: /* The sign string succeeds the quantity and currency_symbol. */
+	case 4: /* The sign string immediately succeeds the currency_symbol.  */
+		pos_sign_pre  = "_\xe2\x88\x92";
+		pos_sign_post = "_\xe2\x88\x92";
+		neg_sign_pre  = "_\xe2\x88\x92";
+		neg_sign_post = "\"\xe2\x88\x92\"";
+		break;
+	default:
+	case 0: /*  Parentheses surround the quantity and currency_symbol.    */
+		pos_sign_pre  = "_(";
+		pos_sign_post = "_)";
+		neg_sign_pre  = "(";
+		neg_sign_post = ")";
+		break;
+	}
+
 	/*
 	 *  1. "$*  "	Yes, it is needed (because we use match[])
 	 *  2. "$*  "	This one is like \1, but doesn't have the \{0,1\}
@@ -201,8 +228,9 @@
 		pre = g_strconcat ("\"", curr,
 				   (space_sep ? "\" " : "\""), NULL);
 	} else {
-		pre_rep = pre = (char *)"";
-		post_rep = (char *)"* ";
+		pre = (char *)"";
+		pre_rep = (char *)"* ";
+		post_rep = (char *)"";
 		post = g_strconcat ((space_sep ? " \"" : "\""),
 				    curr, "\"", NULL);
 	}
@@ -227,15 +255,23 @@
 		pre, post, pre, post);
 
 	fmts_accounting [0] = g_strdup_printf (
-		"_(%s%s#,##0%s%s_);_(%s%s(#,##0)%s%s;_(%s%s\"-\"%s%s_);_(@_)",
-		pre, pre_rep, post_rep, post,
-		pre, pre_rep, post_rep, post,
-		pre, pre_rep, post_rep, post);
+		"%s%s%s#,##0%s%s%s;"
+		"%s%s%s(#,##0%s%s%s;"
+		"%s%s%s\"\xe2\x88\x92\"%s%s%s;"
+		"%s@%s",
+		pos_sign_pre, pre, pre_rep, post_rep, post, pos_sign_post,
+		neg_sign_pre, pre, pre_rep, post_rep, post, neg_sign_post,
+		pos_sign_pre, pre, pre_rep, post_rep, post, pos_sign_post,
+		pos_sign_pre, pos_sign_post);
 	fmts_accounting [2] = g_strdup_printf (
-		"_(%s%s#,##0.00%s%s_);_(%s%s(#,##0.00)%s%s;_(%s%s\"-\"??%s%s_);_(@_)",
-		pre, pre_rep, post_rep, post,
-		pre, pre_rep, post_rep, post,
-		pre, pre_rep, post_rep, post);
+		"%s%s%s#,##0.00%s%s%s;"
+		"%s%s%s#,##0.00%s%s%s;"
+		"%s%s%s\"\xe2\x88\x92\"??%s%s%s;"
+		"%s@%s",
+		pos_sign_pre, pre, pre_rep, post_rep, post, pos_sign_post,
+		neg_sign_pre, pre, pre_rep, post_rep, post, neg_sign_post,
+		pos_sign_pre, pre, pre_rep, post_rep, post, pos_sign_post,
+		pos_sign_pre, pos_sign_post);
 
 	g_free (*pre ? pre : post);
 
