mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
add monetary value parsing routine
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@493 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
25b5356e49
commit
ea3eb1950b
106
src/QIFIO.c
106
src/QIFIO.c
@ -394,100 +394,6 @@ void xaccParseQIFDate (Date * dat, char * str)
|
|||||||
dat->year += 1900;
|
dat->year += 1900;
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************\
|
|
||||||
* xaccParseQIFAmount *
|
|
||||||
* parses dollar ammount of the form DDD,DDD,DDD.CC *
|
|
||||||
* *
|
|
||||||
* Args: str -- pointer to string rep of sum *
|
|
||||||
* Return: int -- in pennies *
|
|
||||||
\********************************************************************/
|
|
||||||
|
|
||||||
double xaccParseQIFAmount (char * str)
|
|
||||||
{
|
|
||||||
char * tok;
|
|
||||||
double dollars = 0.0;
|
|
||||||
int len;
|
|
||||||
int isneg = 0;
|
|
||||||
|
|
||||||
if (!str) return 0.0;
|
|
||||||
|
|
||||||
if ('-' == str[0]) {
|
|
||||||
isneg = 1;
|
|
||||||
str += sizeof(char);
|
|
||||||
}
|
|
||||||
|
|
||||||
tok = strchr (str, ',');
|
|
||||||
if (tok) {
|
|
||||||
*tok = 0x0;
|
|
||||||
dollars = ((double) (1000 * atoi (str)));
|
|
||||||
str = tok+sizeof(char);
|
|
||||||
}
|
|
||||||
|
|
||||||
tok = strchr (str, ',');
|
|
||||||
if (tok) {
|
|
||||||
*tok = 0x0;
|
|
||||||
dollars *= 1000.0;
|
|
||||||
dollars += ((double) (1000 * atoi (str)));
|
|
||||||
str = tok+sizeof(char);
|
|
||||||
}
|
|
||||||
|
|
||||||
tok = strchr (str, '.');
|
|
||||||
if (tok) {
|
|
||||||
*tok = 0x0;
|
|
||||||
dollars += ((double) (atoi (str)));
|
|
||||||
str = tok+sizeof(char);
|
|
||||||
|
|
||||||
tok = strchr (str, '\r');
|
|
||||||
if (!tok) {
|
|
||||||
tok = strchr (str, '\n');
|
|
||||||
if (!tok) return dollars;
|
|
||||||
}
|
|
||||||
*tok = 0x0;
|
|
||||||
|
|
||||||
/* strip off garbage at end of the line */
|
|
||||||
tok = strchr (str, '\n');
|
|
||||||
if (tok) *tok = 0x0;
|
|
||||||
|
|
||||||
tok = strchr (str, ' ');
|
|
||||||
if (tok) *tok = 0x0;
|
|
||||||
|
|
||||||
/* adjust for number of decimal places */
|
|
||||||
len = strlen(str);
|
|
||||||
if (6 == len) {
|
|
||||||
dollars += 0.000001 * ((double) atoi (str));
|
|
||||||
} else
|
|
||||||
if (5 == len) {
|
|
||||||
dollars += 0.00001 * ((double) atoi (str));
|
|
||||||
} else
|
|
||||||
if (4 == len) {
|
|
||||||
dollars += 0.0001 * ((double) atoi (str));
|
|
||||||
} else
|
|
||||||
if (3 == len) {
|
|
||||||
dollars += 0.001 * ((double) atoi (str));
|
|
||||||
} else
|
|
||||||
if (2 == len) {
|
|
||||||
dollars += 0.01 * ((double) atoi (str));
|
|
||||||
} else
|
|
||||||
if (1 == len) {
|
|
||||||
dollars += 0.1 * ((double) atoi (str));
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
tok = strchr (str, '\r');
|
|
||||||
if (tok) *tok = 0x0;
|
|
||||||
tok = strchr (str, '\n');
|
|
||||||
if (tok) *tok = 0x0;
|
|
||||||
tok = strchr (str, ' ');
|
|
||||||
if (tok) *tok = 0x0;
|
|
||||||
|
|
||||||
dollars += ((double) (atoi (str)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isneg) dollars = -dollars;
|
|
||||||
|
|
||||||
return dollars;
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************************************************\
|
/********************************************************************\
|
||||||
\********************************************************************/
|
\********************************************************************/
|
||||||
|
|
||||||
@ -623,7 +529,7 @@ char * xaccReadQIFTransaction (int fd, Account *acc)
|
|||||||
|
|
||||||
/* I == share price */
|
/* I == share price */
|
||||||
if ('I' == qifline [0]) {
|
if ('I' == qifline [0]) {
|
||||||
trans -> credit_split.share_price = xaccParseQIFAmount (&qifline[1]);
|
trans -> credit_split.share_price = xaccParseUSAmount (&qifline[1]);
|
||||||
} else
|
} else
|
||||||
|
|
||||||
/* L == name of acount from which transfer occured */
|
/* L == name of acount from which transfer occured */
|
||||||
@ -666,7 +572,7 @@ char * xaccReadQIFTransaction (int fd, Account *acc)
|
|||||||
* math errors ... */
|
* math errors ... */
|
||||||
if ('O' == qifline [0]) {
|
if ('O' == qifline [0]) {
|
||||||
double pute;
|
double pute;
|
||||||
adjust = xaccParseQIFAmount (&qifline[1]);
|
adjust = xaccParseUSAmount (&qifline[1]);
|
||||||
pute = (trans->credit_split.damount) * (trans->credit_split.share_price);
|
pute = (trans->credit_split.damount) * (trans->credit_split.share_price);
|
||||||
if (isneg) pute = -pute;
|
if (isneg) pute = -pute;
|
||||||
|
|
||||||
@ -680,7 +586,7 @@ char * xaccReadQIFTransaction (int fd, Account *acc)
|
|||||||
|
|
||||||
/* Q == number of shares */
|
/* Q == number of shares */
|
||||||
if ('Q' == qifline [0]) {
|
if ('Q' == qifline [0]) {
|
||||||
trans -> credit_split.damount = xaccParseQIFAmount (&qifline[1]);
|
trans -> credit_split.damount = xaccParseUSAmount (&qifline[1]);
|
||||||
if (isneg) trans -> credit_split.damount = - (trans->credit_split.damount);
|
if (isneg) trans -> credit_split.damount = - (trans->credit_split.damount);
|
||||||
got_share_quantity = 1;
|
got_share_quantity = 1;
|
||||||
} else
|
} else
|
||||||
@ -706,7 +612,7 @@ char * xaccReadQIFTransaction (int fd, Account *acc)
|
|||||||
if ('T' == qifline [0]) {
|
if ('T' == qifline [0]) {
|
||||||
/* ignore T for stock transactions, since T is a dollar amount */
|
/* ignore T for stock transactions, since T is a dollar amount */
|
||||||
if (0 == got_share_quantity) {
|
if (0 == got_share_quantity) {
|
||||||
trans -> credit_split.damount = xaccParseQIFAmount (&qifline[1]);
|
trans -> credit_split.damount = xaccParseUSAmount (&qifline[1]);
|
||||||
if (isneg) trans -> credit_split.damount = - (trans->credit_split.damount);
|
if (isneg) trans -> credit_split.damount = - (trans->credit_split.damount);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@ -727,7 +633,7 @@ char * xaccReadQIFTransaction (int fd, Account *acc)
|
|||||||
if ('$' == qifline [0]) {
|
if ('$' == qifline [0]) {
|
||||||
/* for splits, $ records the part of the total for each split */
|
/* for splits, $ records the part of the total for each split */
|
||||||
if (split) {
|
if (split) {
|
||||||
split -> damount = xaccParseQIFAmount (&qifline[1]);
|
split -> damount = xaccParseUSAmount (&qifline[1]);
|
||||||
} else {
|
} else {
|
||||||
/* Currently, it appears that the $ amount is a redundant
|
/* Currently, it appears that the $ amount is a redundant
|
||||||
* number that we can safely ignore. To get fancy,
|
* number that we can safely ignore. To get fancy,
|
||||||
@ -738,7 +644,7 @@ char * xaccReadQIFTransaction (int fd, Account *acc)
|
|||||||
*/
|
*/
|
||||||
double parse, pute;
|
double parse, pute;
|
||||||
int got, wanted;
|
int got, wanted;
|
||||||
parse = xaccParseQIFAmount (&qifline[1]);
|
parse = xaccParseUSAmount (&qifline[1]);
|
||||||
pute = (trans->credit_split.damount) * (trans->credit_split.share_price);
|
pute = (trans->credit_split.damount) * (trans->credit_split.share_price);
|
||||||
if (isneg) pute = -pute;
|
if (isneg) pute = -pute;
|
||||||
|
|
||||||
|
96
src/util.c
96
src/util.c
@ -108,5 +108,101 @@ char * xaccPrintAmount (double val, short shrs)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************\
|
||||||
|
* xaccParseUSAmount *
|
||||||
|
* parses U.S. style monetary strings *
|
||||||
|
* (strings of the form DDD,DDD,DDD.CC *
|
||||||
|
* *
|
||||||
|
* Args: str -- pointer to string rep of sum *
|
||||||
|
* Return: double -- the parsed amount *
|
||||||
|
\********************************************************************/
|
||||||
|
|
||||||
|
double xaccParseUSAmount (char * str)
|
||||||
|
{
|
||||||
|
char * tok;
|
||||||
|
double dollars = 0.0;
|
||||||
|
int len;
|
||||||
|
int isneg = 0;
|
||||||
|
|
||||||
|
if (!str) return 0.0;
|
||||||
|
|
||||||
|
if ('-' == str[0]) {
|
||||||
|
isneg = 1;
|
||||||
|
str += sizeof(char);
|
||||||
|
}
|
||||||
|
|
||||||
|
tok = strchr (str, ',');
|
||||||
|
if (tok) {
|
||||||
|
*tok = 0x0;
|
||||||
|
dollars = ((double) (1000 * atoi (str)));
|
||||||
|
str = tok+sizeof(char);
|
||||||
|
}
|
||||||
|
|
||||||
|
tok = strchr (str, ',');
|
||||||
|
if (tok) {
|
||||||
|
*tok = 0x0;
|
||||||
|
dollars *= 1000.0;
|
||||||
|
dollars += ((double) (1000 * atoi (str)));
|
||||||
|
str = tok+sizeof(char);
|
||||||
|
}
|
||||||
|
|
||||||
|
tok = strchr (str, '.');
|
||||||
|
if (tok) {
|
||||||
|
*tok = 0x0;
|
||||||
|
dollars += ((double) (atoi (str)));
|
||||||
|
str = tok+sizeof(char);
|
||||||
|
|
||||||
|
tok = strchr (str, '\r');
|
||||||
|
if (!tok) {
|
||||||
|
tok = strchr (str, '\n');
|
||||||
|
if (!tok) return dollars;
|
||||||
|
}
|
||||||
|
*tok = 0x0;
|
||||||
|
|
||||||
|
/* strip off garbage at end of the line */
|
||||||
|
tok = strchr (str, '\n');
|
||||||
|
if (tok) *tok = 0x0;
|
||||||
|
|
||||||
|
tok = strchr (str, ' ');
|
||||||
|
if (tok) *tok = 0x0;
|
||||||
|
|
||||||
|
/* adjust for number of decimal places */
|
||||||
|
len = strlen(str);
|
||||||
|
if (6 == len) {
|
||||||
|
dollars += 0.000001 * ((double) atoi (str));
|
||||||
|
} else
|
||||||
|
if (5 == len) {
|
||||||
|
dollars += 0.00001 * ((double) atoi (str));
|
||||||
|
} else
|
||||||
|
if (4 == len) {
|
||||||
|
dollars += 0.0001 * ((double) atoi (str));
|
||||||
|
} else
|
||||||
|
if (3 == len) {
|
||||||
|
dollars += 0.001 * ((double) atoi (str));
|
||||||
|
} else
|
||||||
|
if (2 == len) {
|
||||||
|
dollars += 0.01 * ((double) atoi (str));
|
||||||
|
} else
|
||||||
|
if (1 == len) {
|
||||||
|
dollars += 0.1 * ((double) atoi (str));
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
tok = strchr (str, '\r');
|
||||||
|
if (tok) *tok = 0x0;
|
||||||
|
tok = strchr (str, '\n');
|
||||||
|
if (tok) *tok = 0x0;
|
||||||
|
tok = strchr (str, ' ');
|
||||||
|
if (tok) *tok = 0x0;
|
||||||
|
|
||||||
|
dollars += ((double) (atoi (str)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isneg) dollars = -dollars;
|
||||||
|
|
||||||
|
return dollars;
|
||||||
|
}
|
||||||
|
|
||||||
/************************* END OF FILE ******************************\
|
/************************* END OF FILE ******************************\
|
||||||
\********************************************************************/
|
\********************************************************************/
|
||||||
|
Loading…
Reference in New Issue
Block a user