More numerics conversion.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3135 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2000-11-08 06:36:51 +00:00
parent 96cf94fe87
commit 53df065d52
8 changed files with 144 additions and 117 deletions

View File

@ -71,7 +71,9 @@ _gnc_euro_rate_compare_(const void * key,
{
const gnc_commodity * curr = key;
const gnc_euro_rate_struct * euro = value;
if(!key || !value) return -1;
if (!key || !value)
return -1;
return strcasecmp(gnc_commodity_get_mnemonic(curr), euro->currency);
@ -109,21 +111,21 @@ gnc_is_euro_currency(const gnc_commodity * currency) {
/* ------------------------------------------------------ */
double
gnc_convert_to_euro(const gnc_commodity * currency, double value) {
gnc_numeric
gnc_convert_to_euro(const gnc_commodity * currency, gnc_numeric value) {
gnc_euro_rate_struct *result;
const char *namespace;
if (currency == NULL)
return 0.0;
return gnc_numeric_zero ();
namespace = gnc_commodity_get_namespace (currency);
if (namespace == NULL)
return FALSE;
return gnc_numeric_zero ();
if (strcmp (namespace, GNC_COMMODITY_NS_ISO) != 0)
return FALSE;
return gnc_numeric_zero ();
result = bsearch(currency,
_gnc_euro_rate_,
@ -132,29 +134,35 @@ gnc_convert_to_euro(const gnc_commodity * currency, double value) {
_gnc_euro_rate_compare_);
if (result == NULL)
return 0.0;
return gnc_numeric_zero ();
/* round to 2 decimal places */
return (floor(((value / result->rate) * 100.0) + 0.5) / 100.0);
{
gnc_numeric rate;
rate = double_to_gnc_numeric (result->rate, 100000, GNC_RND_ROUND);
return gnc_numeric_div (value, rate, 100, GNC_RND_FLOOR);
}
}
/* ------------------------------------------------------ */
double
gnc_convert_from_euro(const gnc_commodity * currency, double value) {
gnc_numeric
gnc_convert_from_euro(const gnc_commodity * currency, gnc_numeric value) {
gnc_euro_rate_struct * result;
const char *namespace;
if (currency == NULL)
return 0.0;
return gnc_numeric_zero ();
namespace = gnc_commodity_get_namespace (currency);
if (namespace == NULL)
return FALSE;
return gnc_numeric_zero ();
if (strcmp (namespace, GNC_COMMODITY_NS_ISO) != 0)
return FALSE;
return gnc_numeric_zero ();
result = bsearch(currency,
_gnc_euro_rate_,
@ -163,9 +171,16 @@ gnc_convert_from_euro(const gnc_commodity * currency, double value) {
_gnc_euro_rate_compare_);
if (result == NULL)
return 0.0;
return gnc_numeric_zero ();
return (value * result->rate);
{
gnc_numeric rate;
rate = double_to_gnc_numeric (result->rate, 100000, GNC_RND_ROUND);
return gnc_numeric_mul (value, rate, gnc_commodity_get_fraction (currency),
GNC_RND_ROUND);
}
}
/* ------------------------------------------------------ */

View File

@ -25,10 +25,13 @@
#include <glib.h>
#include "gnc-commodity.h"
#include "gnc-numeric.h"
gboolean gnc_is_euro_currency(const gnc_commodity * currency);
double gnc_convert_to_euro(const gnc_commodity * currency, double value);
double gnc_convert_from_euro(const gnc_commodity * currency, double value);
gboolean gnc_is_euro_currency (const gnc_commodity * currency);
gnc_numeric gnc_convert_to_euro (const gnc_commodity * currency,
gnc_numeric value);
gnc_numeric gnc_convert_from_euro (const gnc_commodity * currency,
gnc_numeric value);
const gnc_commodity * gnc_get_euro (void);

View File

@ -996,11 +996,11 @@ gnc_account_tree_insert_row(GNCAccountTree *tree,
if (gnc_color_deficits())
{
GtkStyle *style;
double balance;
gnc_numeric balance;
gboolean deficit;
balance = gnc_ui_account_get_balance(acc, FALSE);
deficit = (balance < 0) && !DEQ(balance, 0);
balance = gnc_ui_account_get_balance (acc, FALSE);
deficit = gnc_numeric_negative_p (balance);
if (deficit)
style = tree->deficit_style;
@ -1012,7 +1012,7 @@ gnc_account_tree_insert_row(GNCAccountTree *tree,
tree->balance_column, style);
balance = gnc_ui_account_get_balance(acc, TRUE);
deficit = (balance < 0) && !DEQ(balance, 0);
deficit = gnc_numeric_negative_p (balance);
if (deficit)
style = tree->deficit_style;

View File

@ -215,27 +215,27 @@ gnc_ui_get_account_field_name(int field)
}
double
gnc_numeric
gnc_ui_account_get_balance(Account *account, gboolean include_children)
{
double balance;
gnc_numeric balance;
if (account == NULL)
return 0.0;
return gnc_numeric_zero ();
balance = DxaccAccountGetBalance (account);
balance = xaccAccountGetBalance (account);
if (include_children)
{
AccountGroup *children;
children = xaccAccountGetChildren (account);
balance += DxaccGroupGetBalance (children);
balance = gnc_numeric_add_fixed (balance, xaccGroupGetBalance (children));
}
/* reverse sign if needed */
if (gnc_reverse_balance (account))
balance = -balance;
balance = gnc_numeric_neg (balance);
return balance;
}
@ -274,42 +274,44 @@ gnc_ui_get_account_field_value_string(Account *account, int field)
break;
case ACCOUNT_BALANCE :
{
double balance = gnc_ui_account_get_balance(account, FALSE);
gnc_numeric balance = gnc_ui_account_get_balance(account, FALSE);
return DxaccPrintAmount(balance,
gnc_account_value_print_info (account, TRUE));
return xaccPrintAmount(balance,
gnc_account_value_print_info (account, TRUE));
}
break;
case ACCOUNT_BALANCE_EURO :
{
const gnc_commodity * account_currency =
xaccAccountGetCurrency(account);
double balance = gnc_ui_account_get_balance(account, FALSE);
double euro_balance = gnc_convert_to_euro(account_currency, balance);
gnc_numeric balance = gnc_ui_account_get_balance(account, FALSE);
gnc_numeric euro_balance = gnc_convert_to_euro(account_currency,
balance);
return DxaccPrintAmount(euro_balance,
gnc_commodity_print_info (gnc_get_euro (),
TRUE));
return xaccPrintAmount(euro_balance,
gnc_commodity_print_info (gnc_get_euro (),
TRUE));
}
break;
case ACCOUNT_TOTAL :
{
double balance = gnc_ui_account_get_balance(account, TRUE);
gnc_numeric balance = gnc_ui_account_get_balance(account, TRUE);
return DxaccPrintAmount(balance,
gnc_account_value_print_info (account, TRUE));
return xaccPrintAmount(balance,
gnc_account_value_print_info (account, TRUE));
}
break;
case ACCOUNT_TOTAL_EURO :
{
const gnc_commodity * account_currency =
xaccAccountGetCurrency(account);
double balance = gnc_ui_account_get_balance(account, TRUE);
double euro_balance = gnc_convert_to_euro(account_currency, balance);
gnc_numeric balance = gnc_ui_account_get_balance(account, TRUE);
gnc_numeric euro_balance = gnc_convert_to_euro(account_currency,
balance);
return DxaccPrintAmount(euro_balance,
gnc_commodity_print_info (gnc_get_euro (),
TRUE));
return xaccPrintAmount(euro_balance,
gnc_commodity_print_info (gnc_get_euro (),
TRUE));
}
break;
}
@ -465,7 +467,7 @@ gnc_get_deficit_color(GdkColor *color)
* Returns: none *
\*******************************************************************/
void
gnc_set_label_color(GtkWidget *label, double value)
gnc_set_label_color(GtkWidget *label, gnc_numeric value)
{
gboolean deficit;
GdkColormap *cm;
@ -479,7 +481,7 @@ gnc_set_label_color(GtkWidget *label, double value)
style = gtk_style_copy(style);
deficit = (value < 0) && !DEQ(value, 0);
deficit = gnc_numeric_negative_p (value);
if (deficit)
{

View File

@ -82,7 +82,8 @@ const char * gnc_ui_get_account_field_name(int field);
const char * gnc_ui_get_account_field_value_string(Account *account,
int field);
double gnc_ui_account_get_balance(Account *account, gboolean include_children);
gnc_numeric gnc_ui_account_get_balance(Account *account,
gboolean include_children);
GtkWidget * gnc_ui_source_menu_create(Account *account);
@ -98,7 +99,7 @@ GtkToolbarStyle gnc_get_toolbar_style(void);
gboolean gnc_color_deficits (void);
void gnc_get_deficit_color(GdkColor *color);
void gnc_set_label_color(GtkWidget *label, double value);
void gnc_set_label_color(GtkWidget *label, gnc_numeric value);
char gnc_get_account_separator(void);

View File

@ -29,34 +29,33 @@
#include <string.h>
#include "AccWindow.h"
#include "global-options.h"
#include "dialog-options.h"
#include "FileDialog.h"
#include "gnucash.h"
#include "MainWindow.h"
#include "Destroy.h"
#include "gnc-ui.h"
#include "messages.h"
#include "RegWindow.h"
#include "EuroUtils.h"
#include "FileDialog.h"
#include "MainWindow.h"
#include "Refresh.h"
#include "window-main.h"
#include "window-reconcile.h"
#include "window-register.h"
#include "window-help.h"
#include "RegWindow.h"
#include "Scrub.h"
#include "account-tree.h"
#include "dialog-transfer.h"
#include "dialog-account.h"
#include "dialog-fincalc.h"
#include "dialog-find-transactions.h"
#include "dialog-options.h"
#include "dialog-totd.h"
#include "dialog-transfer.h"
#include "file-history.h"
#include "gtkselect.h"
#include "EuroUtils.h"
#include "Scrub.h"
#include "gnc-engine-util.h"
#include "global-options.h"
#include "gnc-commodity.h"
#include "gnc-engine-util.h"
#include "gnc-engine.h"
#include "gnc-ui.h"
#include "gnucash.h"
#include "gtkselect.h"
#include "messages.h"
#include "window-help.h"
#include "window-main.h"
#include "window-reconcile.h"
#include "window-register.h"
/* FIXME get rid of these */
#include <g-wrap.h>
@ -102,8 +101,8 @@ static GNCMainInfo * gnc_get_main_info(void);
* be better ways to do this, but none occurred. */
struct _GNCCurrencyAcc {
const gnc_commodity * currency;
double assets;
double profits;
gnc_numeric assets;
gnc_numeric profits;
};
typedef struct _GNCCurrencyAcc GNCCurrencyAcc;
@ -117,7 +116,7 @@ struct _GNCCurrencyItem {
GtkWidget *listitem;
GtkWidget *assets_label;
GtkWidget *profits_label;
gint touched:1;
gint touched : 1;
};
typedef struct _GNCCurrencyItem GNCCurrencyItem;
@ -208,11 +207,11 @@ gnc_ui_get_currency_accumulator(GList **list, const gnc_commodity * currency)
}
}
found = g_new0(GNCCurrencyAcc, 1);
found = g_new0 (GNCCurrencyAcc, 1);
found->currency = currency;
found->assets = 0.0;
found->profits = 0.0;
*list = g_list_append(*list, found);
found->assets = gnc_numeric_zero ();
found->profits = gnc_numeric_zero ();
*list = g_list_append (*list, found);
return found;
}
@ -253,7 +252,7 @@ static void
gnc_ui_accounts_recurse (AccountGroup *group, GList **currency_list,
gboolean euro)
{
double amount;
gnc_numeric amount;
AccountGroup *children;
Account *account;
int num_accounts;
@ -276,6 +275,8 @@ gnc_ui_accounts_recurse (AccountGroup *group, GList **currency_list,
euro_accum = gnc_ui_get_currency_accumulator(currency_list,
euro_commodity);
}
else
euro_commodity = NULL;
num_accounts = xaccGroupGetNumAccounts(group);
for (i = 0; i < num_accounts; i++)
@ -297,20 +298,35 @@ gnc_ui_accounts_recurse (AccountGroup *group, GList **currency_list,
case MUTUAL:
case CREDIT:
case LIABILITY:
amount = DxaccAccountGetBalance(account);
currency_accum->assets += amount;
if(euro)
euro_accum->assets += gnc_convert_to_euro(account_currency, amount);
amount = xaccAccountGetBalance(account);
currency_accum->assets =
gnc_numeric_add (currency_accum->assets, amount,
gnc_commodity_get_fraction (account_currency),
GNC_RND_ROUND);
if (euro)
euro_accum->assets =
gnc_numeric_add (euro_accum->assets,
gnc_convert_to_euro(account_currency, amount),
gnc_commodity_get_fraction (euro_commodity),
GNC_RND_ROUND);
if (children != NULL)
gnc_ui_accounts_recurse(children, currency_list, euro);
break;
case INCOME:
case EXPENSE:
amount = DxaccAccountGetBalance(account);
currency_accum->profits -= amount;
if(euro)
euro_accum->profits -= gnc_convert_to_euro(account_currency, amount);
amount = xaccAccountGetBalance(account);
currency_accum->profits =
gnc_numeric_sub (currency_accum->profits, amount,
gnc_commodity_get_fraction (account_currency),
GNC_RND_ROUND);
if (euro)
gnc_numeric_sub (euro_accum->profits,
gnc_convert_to_euro(account_currency, amount),
gnc_commodity_get_fraction (euro_commodity),
GNC_RND_ROUND);
if (children != NULL)
gnc_ui_accounts_recurse(children, currency_list, euro);
@ -392,15 +408,13 @@ gnc_ui_refresh_statusbar (void)
main_info->totals_combo);
currency_item->touched = 1;
DxaccSPrintAmount(asset_string, currency_accum->assets,
gnc_commodity_print_info (currency_accum->currency,
TRUE));
xaccSPrintAmount(asset_string, currency_accum->assets,
gnc_commodity_print_info(currency_accum->currency, TRUE));
gtk_label_set_text(GTK_LABEL(currency_item->assets_label), asset_string);
gnc_set_label_color(currency_item->assets_label, currency_accum->assets);
DxaccSPrintAmount(profit_string, currency_accum->profits,
gnc_commodity_print_info (currency_accum->currency,
TRUE));
xaccSPrintAmount(profit_string, currency_accum->profits,
gnc_commodity_print_info(currency_accum->currency, TRUE));
gtk_label_set_text(GTK_LABEL(currency_item->profits_label), profit_string);
gnc_set_label_color(currency_item->profits_label, currency_accum->profits);
@ -479,16 +493,16 @@ gnc_refresh_main_window()
}
static void
gnc_ui_find_transactions_cb ( GtkWidget *widget, gpointer data )
gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data)
{
gnc_ui_find_transactions_dialog_create(NULL);
}
static void
gnc_ui_exit_cb ( GtkWidget *widget, gpointer data )
gnc_ui_exit_cb (GtkWidget *widget, gpointer data)
{
gnc_shutdown(0);
gnc_shutdown (0);
}
static void
@ -517,19 +531,19 @@ gnc_ui_totd_cb (GtkWidget *widget, gpointer data)
}
static void
gnc_ui_help_cb ( GtkWidget *widget, gpointer data )
gnc_ui_help_cb (GtkWidget *widget, gpointer data)
{
helpWindow(NULL, NULL, HH_MAIN);
}
static void
gnc_ui_add_account ( GtkWidget *widget, gpointer data )
gnc_ui_add_account (GtkWidget *widget, gpointer data)
{
gnc_ui_new_account_window (NULL);
}
static void
gnc_ui_delete_account ( Account *account )
gnc_ui_delete_account (Account *account)
{
/* Step 1: Delete associated windows */
xaccAccountWindowDestroy(account);
@ -547,7 +561,7 @@ gnc_ui_delete_account ( Account *account )
}
static void
gnc_ui_delete_account_cb ( GtkWidget *widget, gpointer data )
gnc_ui_delete_account_cb (GtkWidget *widget, gpointer data)
{
Account *account = gnc_get_current_account();
@ -575,7 +589,7 @@ gnc_ui_delete_account_cb ( GtkWidget *widget, gpointer data )
}
static void
gnc_ui_mainWindow_toolbar_open ( GtkWidget *widget, gpointer data )
gnc_ui_mainWindow_toolbar_open (GtkWidget *widget, gpointer data)
{
RegWindow *regData;
Account *account = gnc_get_current_account();
@ -615,7 +629,7 @@ gnc_ui_mainWindow_toolbar_open_subs(GtkWidget *widget, gpointer data)
}
static void
gnc_ui_mainWindow_toolbar_edit ( GtkWidget *widget, gpointer data )
gnc_ui_mainWindow_toolbar_edit (GtkWidget *widget, gpointer data)
{
Account *account = gnc_get_current_account();
AccountWindow *edit_window_data;

View File

@ -199,8 +199,7 @@ recnRecalculateBalance(RecnWindow *recnData)
starting = gnc_numeric_neg (starting);
amount = xaccPrintAmount(starting, print_info);
gnc_set_label_color(recnData->starting,
gnc_numeric_to_double (starting));
gnc_set_label_color(recnData->starting, starting);
gtk_label_set_text(GTK_LABEL(recnData->starting), amount);
if (reverse_balance)
starting = gnc_numeric_neg (starting);
@ -210,8 +209,7 @@ recnRecalculateBalance(RecnWindow *recnData)
if (reverse_balance)
ending = gnc_numeric_neg (ending);
amount = xaccPrintAmount(ending, print_info);
gnc_set_label_color(recnData->ending,
gnc_numeric_to_double (ending));
gnc_set_label_color(recnData->ending, ending);
gtk_label_set_text(GTK_LABEL(recnData->ending), amount);
if (reverse_balance)
ending = gnc_numeric_neg (ending);
@ -236,8 +234,7 @@ recnRecalculateBalance(RecnWindow *recnData)
if (reverse_balance)
reconciled = gnc_numeric_neg (reconciled);
amount = xaccPrintAmount(reconciled, print_info);
gnc_set_label_color(recnData->reconciled,
gnc_numeric_to_double (reconciled));
gnc_set_label_color(recnData->reconciled, reconciled);
gtk_label_set_text(GTK_LABEL(recnData->reconciled), amount);
if (reverse_balance)
reconciled = gnc_numeric_neg (reconciled);
@ -247,8 +244,7 @@ recnRecalculateBalance(RecnWindow *recnData)
if (reverse_balance)
diff = gnc_numeric_neg (diff);
amount = xaccPrintAmount(diff, print_info);
gnc_set_label_color(recnData->difference,
gnc_numeric_to_double (diff));
gnc_set_label_color(recnData->difference, diff);
gtk_label_set_text(GTK_LABEL(recnData->difference), amount);
if (reverse_balance)
diff = gnc_numeric_neg (diff);

View File

@ -1844,14 +1844,12 @@ regRefresh(xaccLedgerDisplay *ledger)
if (euro)
{
strcat(string, " / ");
DxaccSPrintAmount(string + strlen(string),
gnc_convert_to_euro(currency,
gnc_numeric_to_double (amount)),
gnc_commodity_print_info (gnc_get_euro (), TRUE));
xaccSPrintAmount(string + strlen(string),
gnc_convert_to_euro(currency, amount),
gnc_commodity_print_info (gnc_get_euro (), TRUE));
}
gnc_set_label_color(regData->balance_label,
gnc_numeric_to_double (amount));
gnc_set_label_color(regData->balance_label, amount);
gtk_label_set_text(GTK_LABEL(regData->balance_label), string);
}
@ -1865,14 +1863,12 @@ regRefresh(xaccLedgerDisplay *ledger)
if (euro)
{
strcat(string, " / ");
DxaccSPrintAmount(string + strlen(string),
gnc_convert_to_euro(currency,
gnc_numeric_to_double (amount)),
gnc_commodity_print_info (gnc_get_euro (), TRUE));
xaccSPrintAmount(string + strlen(string),
gnc_convert_to_euro(currency, amount),
gnc_commodity_print_info (gnc_get_euro (), TRUE));
}
gnc_set_label_color(regData->cleared_label,
gnc_numeric_to_double (amount));
gnc_set_label_color(regData->cleared_label, amount);
gtk_label_set_text(GTK_LABEL(regData->cleared_label), string);
}