/** * Return the real in a formatted string with an optional currency * symbol, according to the locale regarding decimal separator, * thousands separator and positive or negative sign. * * \param number Number to format. * \param currency_number the currency we want to adapt the number, 0 for no adaptation * \param show_symbol TRUE to add the currency symbol in the string * * \return A newly allocated string of the number (this * function will never return NULL) */ gchar *utils_real_get_string_with_currency ( gsb_real number, gint currency_number, gboolean show_symbol ) { struct lconv *locale = gsb_locale_get_locale ( ); gint floating_point; const gchar *currency_symbol = (currency_number && show_symbol) ? gsb_data_currency_get_code_or_isocode (currency_number) : NULL; /* First of all if number = 0 I return 0 with the symbol of the currency if necessary */ if (number.mantissa == 0) { if (currency_symbol && locale -> p_cs_precedes) return g_strdup_printf ( "%s %s", currency_symbol, "0" ); else if (currency_symbol && ! locale -> p_cs_precedes) return g_strdup_printf ( "%s %s", "0", currency_symbol ); else return g_strdup ("0"); } else if ( (number.exponent < 0) || (number.exponent > EXPONENT_MAX ) || (number.mantissa == error_real.mantissa) ) return g_strdup ( ERROR_REAL_STRING ); /* first we need to adapt the exponent to the currency */ /* if the exponent of the real is not the same of the currency, need to adapt it */ floating_point = gsb_data_currency_get_floating_point ( currency_number ); if ( currency_number && number.exponent != floating_point ) number = gsb_real_adjust_exponent ( number, floating_point ); return gsb_real_raw_format_string ( number, locale, currency_symbol ); }
void gsb_real_cunit__gsb_real_raw_format_string ( void ) { gchar *s; GsbReal n; struct lconv conv; memset(&conv, 0, sizeof(conv)); conv.positive_sign = "<+>"; conv.negative_sign = "<->"; conv.mon_thousands_sep = "< >"; conv.mon_decimal_point = "<.>"; gchar *currency_symbol = "<€>"; n.mantissa = 1; n.exponent = 2; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>0<.>01<€>", s); g_free(s); n.mantissa = 10; n.exponent = 2; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>0<.>10<€>", s); g_free(s); n.mantissa = 31415; n.exponent = 1; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>3< >141<.>5<€>", s); g_free(s); n.mantissa = 31415; n.exponent = 9; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>0<.>000031415<€>", s); g_free(s); n.mantissa = 0x7FFFFFFF; n.exponent = 0; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>2< >147< >483< >647<.>0<€>", s); g_free(s); n.mantissa = 0x7FFFFFFF; n.exponent = 1; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>214< >748< >364<.>7<€>", s); g_free(s); n.mantissa = 0x7FFFFFFF; n.exponent = 2; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>21< >474< >836<.>47<€>", s); g_free(s); n.mantissa = G_GINT64_CONSTANT(-2147483649); n.exponent = 0; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<->2< >147< >483< >649<.>0<€>", s); g_free(s); n.mantissa = G_GINT64_CONSTANT(-2147483649); n.exponent = 1; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<->214< >748< >364<.>9<€>", s); g_free(s); n.mantissa = G_GINT64_CONSTANT(-2147483649); n.exponent = 2; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<->21< >474< >836<.>49<€>", s); g_free(s); n.mantissa = 2100000000; n.exponent = 2; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>21< >000< >000<.>00<€>", s); g_free(s); conv.p_sep_by_space = 1; n.mantissa = 123; n.exponent = 2; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>1<.>23 <€>", s); g_free(s); conv.p_sep_by_space = 1; n.mantissa = 123; n.exponent = 2; s = gsb_real_raw_format_string(n, &conv, currency_symbol); CU_ASSERT_STRING_EQUAL("<+>1<.>23 <€>", s); g_free(s); }
/** * Return the real in a formatted string, according to the currency * regarding decimal separator, thousands separator and positive or * negative sign. * this is directly the number coded in the real wich is returned * usually, utils_real_get_string_with_currency is better to adapt the format * of the number to the currency format * * \param number Number to format. * * \return A newly allocated string of the number (this * function will never return NULL) */ gchar *utils_real_get_string ( gsb_real number ) { struct lconv *locale = gsb_locale_get_locale (); return gsb_real_raw_format_string ( number, locale, NULL ); }