Replace the gnc:numeric pair with normal Scheme rationals.

This allows direct conversion between Scheme numbers and gnc_numeric
without the performance or accuracy penalties arising from using doubles
as an intermediary.
This commit is contained in:
John Ralls 2017-12-21 15:30:49 -08:00
parent 7061803596
commit e0300d3a62
30 changed files with 190 additions and 267 deletions

View File

@ -288,7 +288,7 @@
<?scm
(for xpair in xlist do
(let* ((comm (car xpair))
(one-num (gnc:make-gnc-numeric 10000 1))
(one-num 10000/1)
(one-foreign-mny (gnc:make-gnc-monetary comm one-num))
(one-local-mny (exchange-fn one-foreign-mny opt-report-commodity)))
?>

View File

@ -46,7 +46,7 @@
(if (or (not taxable) (eq? taxtable '()))
(display "&nbsp;")
(let* ((amttot (gnc:make-commodity-collector))
(pctot (gnc:make-numeric-collector))
(pctot (gnc:make-number-collector))
(entries (gncTaxTableGetEntries taxtable))
(amt? #f) ; becomes #t if any entries are amounts
(pc? #f)) ; becomes #t if any entries are percentages

View File

@ -53,7 +53,7 @@
(if (or (not taxable) (eq? taxtable '()))
(display "&nbsp;")
(let* ((amttot (gnc:make-commodity-collector))
(pctot (gnc:make-numeric-collector))
(pctot (gnc:make-number-collector))
(entries (gncTaxTableGetEntries taxtable))
(amt? #f) ; becomes #t if any entries are amounts
(pc? #f)) ; becomes #t if any entries are percentages

View File

@ -701,7 +701,7 @@
(gnc-commodity-equiv account-commodity
USD-currency)))
(xaccSplitGetValue split)
(gnc:make-gnc-numeric 100 100)))
100/100))
(missing-pricedb-entry? #f)
(pricedb-lookup-price #f)
(pricedb-lookup-price-value (gnc-numeric-zero))
@ -798,7 +798,7 @@
trans-currency
USD-currency))
(gnc-numeric-div
(gnc:make-gnc-numeric 100 100)
100/100
(xaccSplitGetSharePrice split)
GNC-DENOM-AUTO
(logior (GNC-DENOM-SIGFIGS 6)

View File

@ -415,8 +415,8 @@
;; numeric-collectors, where [abc] are numeric-collectors. See the
;; real variable names below.
(define (make-newrate unknown-coll un->known-coll known-pair)
(let ((a (gnc:make-numeric-collector))
(b (gnc:make-numeric-collector)))
(let ((a (gnc:make-number-collector))
(b (gnc:make-number-collector)))
(a 'add (unknown-coll 'total #f))
(b 'add
;; round to (at least) 8 significant digits
@ -459,7 +459,7 @@
;; If this is an Euro currency, create the
;; pair of appropriately exchanged amounts.
(if euro-monetary
(let ((a (gnc:make-numeric-collector)))
(let ((a (gnc:make-number-collector)))
(a 'add
(gnc:gnc-monetary-amount euro-monetary))
(list report-commodity
@ -532,8 +532,8 @@
(define (create-commodity-list inner-comm outer-comm share-amount value-amount)
(let ((foreignlist (list inner-comm
(cons (gnc:make-numeric-collector)
(gnc:make-numeric-collector))))
(cons (gnc:make-number-collector)
(gnc:make-number-collector))))
(comm-list #f))
((caadr foreignlist) 'add share-amount)
((cdadr foreignlist) 'add value-amount)
@ -560,8 +560,8 @@
(if (not pair)
(begin
(set! pair (list (car foreignlist)
(cons (gnc:make-numeric-collector)
(gnc:make-numeric-collector))))
(cons (gnc:make-number-collector)
(gnc:make-number-collector))))
(gnc:debug "New commodity "
(gnc-commodity-get-mnemonic (car foreignlist)))))
pair))

View File

@ -300,8 +300,6 @@
(lambda ()
(let ((n (read)))
(if (number? n) n 0.0)))))
((gnc:gnc-numeric? elt)
(gnc-numeric-to-double elt))
(#t
0.0)))

View File

@ -335,8 +335,6 @@
(lambda ()
(let ((n (read)))
(if (number? n) n 0.0)))))
((gnc:gnc-numeric? elt)
(gnc-numeric-to-double elt))
(#t
0.0)))

View File

@ -152,9 +152,7 @@
(lambda ()
(let ((n (read)))
(if (number? n) (abs n) 0.0)))))
((gnc:gnc-numeric? elt)
(abs (gnc-numeric-to-double elt)))
(#t
(#t
0.0)))
nlist))

View File

@ -131,9 +131,7 @@
(lambda ()
(let ((n (read)))
(if (number? n) n 0.0)))))
((gnc:gnc-numeric? elt)
(gnc-numeric-to-double elt))
(#t
(#t
0.0)))
(let* ((retval '())

View File

@ -671,7 +671,7 @@
(export gnc:make-stats-collector)
(export gnc:make-drcr-collector)
(export gnc:make-value-collector)
(export gnc:make-numeric-collector)
(export gnc:make-number-collector)
(export gnc:make-commodity-collector)
(export gnc:commodity-collector-get-negated)
(export gnc:commodity-collectorlist-get-merged)

View File

@ -266,24 +266,24 @@
;; Same as above but with gnc:numeric
(define (gnc:make-numeric-collector)
(define (gnc:make-number-collector)
(let ;;; values
((value (gnc-numeric-zero)))
((value 0))
(lambda (action amount) ;;; Dispatch function
(case action
((add) (if (gnc:gnc-numeric? amount)
(set! value (gnc-numeric-add amount value
GNC-DENOM-AUTO GNC-DENOM-LCD))
(gnc:warn
"gnc:numeric-collector called with wrong argument: "
((add) (if (number? amount)
(set! value (gnc-numeric-add amount value
GNC-DENOM-AUTO GNC-DENOM-LCD))
(gnc:warn
"gnc:Number-collector called with wrong argument: "
amount)))
((total) value)
(else (gnc:warn "bad gnc:numeric-collector action: " action))))))
(else (gnc:warn "bad gnc:number-collector action: " action))))))
;; Replace all 'action function calls by the normal functions below.
(define (gnc:numeric-collector-add collector amount)
(define (gnc:number-collector-add collector amount)
(collector 'add amount))
(define (gnc:numeric-collector-total collector)
(define (gnc:number-collector-total collector)
(collector 'total #f))
;; A commodity collector. This is intended to handle multiple
@ -338,12 +338,12 @@
(gnc-commodity-get-fraction commodity) GNC-RND-ROUND)))
(if (not pair)
(begin
;; create a new pair, using the gnc:numeric-collector
(set! pair (list commodity (gnc:make-numeric-collector)))
;; create a new pair, using the gnc:number-collector
(set! pair (list commodity (gnc:make-number-collector)))
;; and add it to the alist
(set! commoditylist (cons pair commoditylist))))
;; add the value
(gnc:numeric-collector-add (cadr pair) rvalue)))
(gnc:number-collector-add (cadr pair) rvalue)))
;; helper function to walk an association list, adding each
;; (commodity -> collector) pair to our list at the appropriate
@ -352,7 +352,7 @@
(cond ((null? clist) '())
(else (add-commodity-value
(caar clist)
(gnc:numeric-collector-total (cadar clist)))
(gnc:number-collector-total (cadar clist)))
(add-commodity-clist (cdr clist)))))
(define (minus-commodity-clist clist)
@ -360,7 +360,7 @@
(else (add-commodity-value
(caar clist)
(gnc-numeric-neg
(gnc:numeric-collector-total (cadar clist))))
(gnc:number-collector-total (cadar clist))))
(minus-commodity-clist (cdr clist)))))
;; helper function walk the association list doing a callback on
@ -368,7 +368,7 @@
(define (process-commodity-list fn clist)
(map
(lambda (pair) (fn (car pair)
(gnc:numeric-collector-total (cadr pair))))
(gnc:number-collector-total (cadr pair))))
clist))
;; helper function which is given a commodity and returns, if
@ -381,8 +381,8 @@
(gnc-numeric-zero)
(if sign?
(gnc-numeric-neg
(gnc:numeric-collector-total (cadr pair)))
(gnc:numeric-collector-total (cadr pair))))
(gnc:number-collector-total (cadr pair)))
(gnc:number-collector-total (cadr pair))))
'()))))
;; helper function which is given a commodity and returns, if
@ -395,8 +395,8 @@
(gnc-numeric-zero)
(if sign?
(gnc-numeric-neg
(gnc:numeric-collector-total (cadr pair)))
(gnc:numeric-collector-total (cadr pair)))))))
(gnc:number-collector-total (cadr pair)))
(gnc:number-collector-total (cadr pair)))))))
;; Dispatch function
(lambda (action commodity amount)

View File

@ -321,7 +321,7 @@
;; If the units ratio is zero the stock is worthless and the value should be zero too
(value-ratio (if (gnc-numeric-zero-p units-ratio)
(gnc-numeric-zero)
(gnc-numeric-div (gnc:make-gnc-numeric 1 1) units-ratio GNC-DENOM-AUTO GNC-DENOM-REDUCE))))
(gnc-numeric-div 1/1 units-ratio GNC-DENOM-AUTO GNC-DENOM-REDUCE))))
(gnc:debug "blist is " b-list " current units is "
(gnc-numeric-to-string current-units)
@ -341,7 +341,7 @@
(gnc:debug "this is a spinoff")
(gnc:debug "blist is " b-list " value ratio is " (gnc-numeric-to-string value-ratio))
(apply-basis-ratio b-list (gnc:make-gnc-numeric 1 1) value-ratio))
(apply-basis-ratio b-list 1/1 value-ratio))
)
;; when all else fails, just send the b-list back
@ -473,7 +473,7 @@
(exchange-fn
(gnc:make-gnc-monetary
(gnc-price-get-currency price)
(gnc:make-gnc-numeric 100 1))
100/1)
currency))))
(set! price #f))
@ -514,7 +514,7 @@
;; If we still don't have a price, use a price of 1 and complain later
(if (not price)
(begin
(set! price (gnc:make-gnc-monetary currency (gnc:make-gnc-numeric 1 1)))
(set! price (gnc:make-gnc-monetary currency 1/1))
;; If use-txn is set, but pricing-txn isn't set, it's a bogus price
(set! use-txn #t)
(set! pricing-txn #f)

View File

@ -427,9 +427,9 @@
(gnc:timepair-ge (gnc-transaction-get-date-posted parent) from-date-tp))
(let* ((parent-description (xaccTransGetDescription parent))
(parent-currency (xaccTransGetCurrency parent)))
;(gnc:debug parent-description
; " - "
; (gnc-commodity-get-printname parent-currency))
(gnc:debug parent-description
" - "
(gnc-commodity-get-printname parent-currency))
(for-each
(lambda (s)
(let* ((s-account (xaccSplitGetAccount s))
@ -444,7 +444,7 @@
(string-append
"WARNING: s-account is NULL for split: "
(gncSplitGetGUID s) "\n")))
;(gnc:debug (xaccAccountGetName s-account))
(gnc:debug (xaccAccountGetName s-account))
(if (and ;; make sure we don't have
(not (null? s-account)) ;; any dangling splits
(or include-trading-accounts (not (eq? s-account-type ACCT-TYPE-TRADING)))
@ -453,7 +453,7 @@
(begin
(if (gnc-numeric-negative-p s-value)
(let ((s-account-in-collector (account-hashtable-ref money-in-hash s-account)))
;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
; (gnc-numeric-to-double s-amount)
; (gnc-commodity-get-printname parent-currency)
; (gnc-numeric-to-double s-value))
@ -494,14 +494,14 @@
)
)
)
)
)
)
)
)
)
(xaccTransGetSplitList parent)
)
)
)
)
)
)

View File

@ -306,20 +306,20 @@ developing over time"))
(let* ((start-frac-avg (averaging-fraction-func (gnc:timepair->secs from-date-tp)))
(end-frac-avg (averaging-fraction-func (+ 1 (gnc:timepair->secs to-date-tp))))
(diff-avg (- end-frac-avg start-frac-avg))
(diff-avg-numeric (gnc:make-gnc-numeric
(diff-avg-numeric (/
(inexact->exact (round (* diff-avg 1000000))) ; 6 decimals precision
1000000))
(start-frac-int (interval-fraction-func (gnc:timepair->secs from-date-tp)))
(end-frac-int (interval-fraction-func (+ 1 (gnc:timepair->secs to-date-tp))))
(diff-int (- end-frac-int start-frac-int))
(diff-int-numeric (gnc:make-gnc-numeric
(diff-int-numeric (/
(inexact->exact diff-int) 1))
)
;; Extra sanity check to ensure a number smaller than 1
(if (> diff-avg diff-int)
(gnc-numeric-div diff-int-numeric diff-avg-numeric GNC-DENOM-AUTO GNC-RND-ROUND)
(gnc:make-gnc-numeric 1 1)))
(gnc:make-gnc-numeric 1 1)))
1/1))
1/1))
;; If there is averaging, the report-title is extended
;; accordingly.
(report-title

View File

@ -314,11 +314,11 @@
(liabilities (assoc-ref rpt 'liability)))
(set! assets-list (if assets (car assets)
(map (lambda (d)
(gnc:make-gnc-monetary report-currency (gnc:make-gnc-numeric 0 1)))
(gnc:make-gnc-monetary report-currency 0/1))
dates-list)))
(set! liability-list (if liabilities (car liabilities)
(map (lambda (d)
(gnc:make-gnc-monetary report-currency (gnc:make-gnc-numeric 0 1)))
(gnc:make-gnc-monetary report-currency 0/1))
dates-list)))
)

View File

@ -355,7 +355,7 @@
(guid (gncAccountGetGUID account))
(num-bal (hash-ref sx-value-hash guid)))
(if num-bal
(if (eq? 0 (gnc:gnc-numeric-denom num-bal))
(if (eq? 0 (denominator num-bal))
(gnc:warn "Oops, invalid gnc_numeric when looking up SX balance for account GUID " guid ": " num-bal)
(begin
(balance-collector

View File

@ -36,7 +36,7 @@
(exchange-fn (lambda (currency amount date) amount))
(report-currency (gnc-default-report-currency))
)
(env-create-transaction env to-date-tp bank-account expense-account (gnc:make-gnc-numeric 100 1))
(env-create-transaction env to-date-tp bank-account expense-account 100/1)
(let ((result (cash-flow-calc-money-in-out (list (cons 'accounts (list bank-account))
(cons 'to-date-tp to-date-tp)
(cons 'from-date-tp from-date-tp)
@ -48,16 +48,24 @@
(money-in-alist (cdr (assq 'money-in-alist result)))
(money-out-alist (cdr (assq 'money-out-alist result)))
(expense-acc-in-collector (cadr (assoc expense-account money-in-alist))))
(and (null? money-out-alist)
(equal? (gnc:make-gnc-numeric 10000 100)
(and (or (null? money-out-alist)
(begin (format #t "The money-out-alist is not null.~%") #f))
(or (equal? 10000/100
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity expense-acc-in-collector
report-currency exchange-fn)))
(equal? (gnc:make-gnc-numeric 10000 100)
(begin (format #t "Failed expense-acc-in-collector ~g expected 100.00~%" (gnc:gnc-monetary-amount (gnc:sum-collector-commodity expense-acc-in-collector
report-currency exchange-fn))) #f))
(or (equal? 10000/100
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-in-collector
report-currency exchange-fn)))
(equal? (gnc:make-gnc-numeric 0 1)
(begin (format #t "Failed money-in-collector ~g expected 100.00~%" (gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-in-collector
report-currency exchange-fn))) #f))
(or (equal? 0/1
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-out-collector
report-currency exchange-fn)))
(begin (format #t "Failed sum-collector-commodity ~g expected 100.00~%" (gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-out-collector
report-currency exchange-fn))) #f))
(begin (format #t "test-one-tx-in-cash-flow success~%") #t)
)))))
(define (test-one-tx-skip-cash-flow)
@ -72,7 +80,7 @@
(exchange-fn (lambda (currency amount date) amount))
(report-currency (gnc-default-report-currency))
)
(env-create-transaction env to-date-tp bank-account wallet-account (gnc:make-gnc-numeric 100 1))
(env-create-transaction env to-date-tp bank-account wallet-account 100/1)
(let ((result (cash-flow-calc-money-in-out (list (cons 'accounts (list wallet-account bank-account))
(cons 'to-date-tp to-date-tp)
(cons 'from-date-tp from-date-tp)
@ -85,12 +93,14 @@
(money-out-alist (cdr (assq 'money-out-alist result))))
(and (null? money-in-alist)
(null? money-out-alist)
(equal? (gnc:make-gnc-numeric 0 1)
(equal? 0/1
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-in-collector
report-currency exchange-fn)))
(equal? (gnc:make-gnc-numeric 0 1)
(equal? 0/1
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-out-collector
report-currency exchange-fn))))))))
report-currency exchange-fn)))
(begin (format #t "test-one-tx-skip-cash-flow success~%") #t)
)))))
(define (test-both-way-cash-flow)
(let* ((env (create-test-env))
@ -104,8 +114,8 @@
(exchange-fn (lambda (currency amount date) amount))
(report-currency (gnc-default-report-currency))
)
(env-create-transaction env to-date-tp bank-account expense-account (gnc:make-gnc-numeric 100 1))
(env-create-transaction env to-date-tp expense-account bank-account (gnc:make-gnc-numeric 50 1))
(env-create-transaction env to-date-tp bank-account expense-account 100/1)
(env-create-transaction env to-date-tp expense-account bank-account 50/1)
(let ((result (cash-flow-calc-money-in-out (list (cons 'accounts (list wallet-account bank-account))
(cons 'to-date-tp to-date-tp)
(cons 'from-date-tp from-date-tp)
@ -124,11 +134,13 @@
(expenses-out-total (gnc:gnc-monetary-amount (gnc:sum-collector-commodity expense-acc-out-collector
report-currency
exchange-fn))))
(and (equal? (gnc:make-gnc-numeric 10000 100) expenses-in-total)
(equal? (gnc:make-gnc-numeric 5000 100) expenses-out-total)
(equal? (gnc:make-gnc-numeric 10000 100)
(and (equal? 10000/100 expenses-in-total)
(equal? 5000/100 expenses-out-total)
(equal? 10000/100
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-in-collector
report-currency exchange-fn)))
(equal? (gnc:make-gnc-numeric 5000 100)
(equal? 5000/100
(gnc:gnc-monetary-amount (gnc:sum-collector-commodity money-out-collector
report-currency exchange-fn))))))))
report-currency exchange-fn)))
(begin (format #t "test-both-way-cash-flow success~%") #t)
)))))

View File

@ -79,12 +79,12 @@
date-1
bank-account
income-account
(gnc:make-gnc-numeric 1 1))
1/1)
(env-create-transaction env
date-2
wallet-account
income-account
(gnc:make-gnc-numeric 5 1))
5/1)
(begin
(set-option report gnc:pagename-display "Show Table" #t)
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
@ -111,25 +111,27 @@
(list (list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
result))))
result))))
(format #t "Report Result ~a~%" result)
(and (every (lambda (row) ; test in=net & out=0 in all rows (all days)
(and (or (equal? (second row) (fourth row))
(begin (format #t "Failed, ~a and ~a differ~%" (second row) (fourth row)) #f))
(or (= 0 (string->number (car (third row))))
(begin (format #t "Failed ~d isn't 0~%" (car (third row))) #f))))
tbl)
(or (= 0 (tbl-ref->number tbl 0 1)) (begin (format #t "Failed refnum ~d isn't 0~%" (tbl-ref->number tbl 0 1) )) #f)) ; 1st day in =0
(or (= 1 (tbl-ref->number tbl 1 1)) (begin (format #t "Failed refnum ~d isn't 1~%" (tbl-ref->number tbl 1 1)) #f)) ; 2nd day in =1
(or (= 5 (tbl-ref->number tbl 2 1)) (begin (format #t "Failed refnum ~d isn't 5~%" (tbl-ref->number tbl 2 1)) #f)) ; 3rd day in =5
(or (= (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) (begin (format #t "Failed refnums ~d and ~d differ ~%" (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) #f)); total in=total net
(or (= 0 (tbl-ref->number total 0 1)) (begin (format #t "Failed refnum ~d isn't 0~%" (tbl-ref->number total 0 1)) #f)) ; total out=0
(or (= 3 (tbl-row-count tbl)) (begin (format #t "Failed row count ~d isn't 3~%" (tbl-row-count tbl)) #f))
(or (= 4 (tbl-column-count tbl)) (begin (format #t "Failed column count ~d isn't 4~%" (tbl-column-count tbl)) #f))))
(or (= 0 (tbl-ref->number tbl 0 1))
(begin (format #t "Failed refnum ~g isn't 0~%" (tbl-ref->number tbl 0 1)) #f)) ; 1st day in =0
(or (= 1 (tbl-ref->number tbl 1 1)) (begin (format #t "Failed refnum ~g isn't 1~%" (tbl-ref->number tbl 1 1)) #f)) ; 2nd day in =1
(or (= 5 (tbl-ref->number tbl 2 1)) (begin (format #t "Failed refnum ~g isn't 5~%" (tbl-ref->number tbl 2 1)) #f)) ; 3rd day in =5
(or (= (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) (begin (format #t "Failed refnums ~g and ~g differ ~%" (tbl-ref->number total 0 0) (tbl-ref->number total 0 2)) #f)); total in=total net
(or (= 0 (tbl-ref->number total 0 1)) (begin (format #t "Failed refnum ~g isn't 0~%" (tbl-ref->number total 0 1)) #f)) ; total out=0
(or (= 3 (tbl-row-count tbl)) (begin (format #t "Failed row count ~g isn't 3~%" (tbl-row-count tbl)) #f))
(or (= 4 (tbl-column-count tbl)) (begin (format #t "Failed column count ~g isn't 4~%" (tbl-column-count tbl)) #f))))
)
)
)
)
)
;; Test two transactions from two different assets to expense in two different days
(define (test-out-txn)
@ -151,22 +153,22 @@
date-1
bank-account
income-account
(gnc:make-gnc-numeric 100 1)) ; large in txn to avoid negative net (hard to parse)
100/1) ; large in txn to avoid negative net (hard to parse)
(env-create-transaction env
date-1
expense-account
bank-account
(gnc:make-gnc-numeric 1 1))
1/1)
(env-create-transaction env
date-2
wallet-account
income-account
(gnc:make-gnc-numeric 100 1)) ; large in txn to avoid negative net (hard to parse)
100/1) ; large in txn to avoid negative net (hard to parse)
(env-create-transaction env
date-2
expense-account
wallet-account
(gnc:make-gnc-numeric 5 1))
5/1)
(begin
(set-option report gnc:pagename-display "Show Table" #t)
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
@ -234,17 +236,17 @@
date-1
bank-account
income-account
(gnc:make-gnc-numeric 1 1))
1/1)
(env-create-transaction env
date-1
bank-account
wallet-account
(gnc:make-gnc-numeric 20 1)) ; this transaction should not be counted
20/1) ; this transaction should not be counted
(env-create-transaction env
date-2
wallet-account
income-account
(gnc:make-gnc-numeric 5 1))
5/1)
(begin
(set-option report gnc:pagename-display "Show Table" #t)

View File

@ -82,7 +82,7 @@
(gnc:get-start-this-month)
my-income-account
my-asset-account
(gnc:make-gnc-numeric -1 1))
-1/1)
(begin
(set-option report gnc:pagename-display "Show table" #t)
(set-option report gnc:pagename-general "Start Date"
@ -106,11 +106,13 @@
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
result))))
(and (= 1 (tbl-ref->number tbl 0 1))
(or (and (= 1 (tbl-ref->number tbl 0 1))
(= 0 (tbl-ref->number tbl 0 2))
(= 1 (tbl-ref->number tbl 0 3))
(= 1 (tbl-row-count tbl))
(= 4 (tbl-column-count tbl)))))))))
(= 4 (tbl-column-count tbl)))
(begin (format #t "Single-txn test ~a failed~%" uuid) #f))
))))))
(define (two-txn-test uuid)
@ -133,12 +135,12 @@
date-1
my-income-account
my-asset-account
(gnc:make-gnc-numeric -1 1))
-1/1)
(env-create-transaction env
date-2
my-income-account
my-asset-account
(gnc:make-gnc-numeric -5 1))
-5/1)
(begin
(set-option report gnc:pagename-display "Show table" #t)
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
@ -160,15 +162,24 @@
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
result))))
(and (every (lambda (row)
(and (equal? (second row) (fourth row))
(= 0 (string->number (car (third row))))))
(or (and (every (lambda (row)
(and (or (equal? (second row) (fourth row))
(begin (format "Second Element ~g != fourth element ~g~%" (second row) (fourth row)) #f))
(or (= 0 (string->number (car (third row))))
(begin (format "third row element ~a not 0~%" (car (third row))) #f))))
tbl)
(= 0 (tbl-ref->number tbl 0 1))
(= 1 (tbl-ref->number tbl 1 1))
(= 6 (tbl-ref->number tbl 2 1))
(= 3 (tbl-row-count tbl))
(= 4 (tbl-column-count tbl)))))))))
(or (= 0 (tbl-ref->number tbl 0 1))
(begin (format #t "Item 1 failed: ~g not 0~%" (tbl-ref->number tbl 0 1)) #f))
(or (= 1 (tbl-ref->number tbl 1 1))
(begin (format #t "Item 1 failed: ~g not 1~%" (tbl-ref->number tbl 1 1)) #f))
(or (= 6 (tbl-ref->number tbl 2 1))
(begin (format #t "Item 2 failed: ~g not 6~%" (tbl-ref->number tbl 2 1)) #f))
(or (= 3 (tbl-row-count tbl))
(begin (format #t "Item 3 failed: ~g not 3~%" (tbl-row-count tbl)) #f))
(or (= 4 (tbl-column-count tbl))
(begin (format #t "Item 4 failed: ~g not 4~%" (tbl-column-count tbl)) #f)))
(begin (format #t "Two-txn test ~a failed~%" uuid) #f))
))))))
(define (two-txn-test-2 uuid)
@ -189,10 +200,10 @@
(date-0 (gnc:get-start-this-month))
(date-1 (gnc:timepair-next-day date-0))
(date-2 (gnc:timepair-next-day date-1)))
(env-create-transaction env date-1 my-income-account my-asset-account (gnc:make-gnc-numeric -1 1))
(env-create-transaction env date-1 my-expense-account my-liability-account (gnc:make-gnc-numeric -1 1))
(env-create-transaction env date-2 my-income-account my-asset-account (gnc:make-gnc-numeric -5 1))
(env-create-transaction env date-2 my-expense-account my-liability-account (gnc:make-gnc-numeric -5 1))
(env-create-transaction env date-1 my-income-account my-asset-account -1/1)
(env-create-transaction env date-1 my-expense-account my-liability-account -1/1)
(env-create-transaction env date-2 my-income-account my-asset-account -5/1)
(env-create-transaction env date-2 my-expense-account my-liability-account -5/1)
(begin
(set-option report gnc:pagename-display "Show table" #t)
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
@ -214,7 +225,7 @@
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
result))))
(and (every (lambda (row)
(or (and (every (lambda (row)
(and (= (string->number (car (fourth row)))
(+ (string->number (car (second row)))
(string->number (car (third row)))))
@ -225,7 +236,9 @@
(= 1 (tbl-ref->number tbl 1 1))
(= 6 (tbl-ref->number tbl 2 1))
(= 3 (tbl-row-count tbl))
(= 4 (tbl-column-count tbl)))))))))
(= 4 (tbl-column-count tbl)))
(begin (format #t "two-txn test 2 ~a failed~%" uuid) #f))
))))))
(define (two-txn-test-income uuid)
(let* ((template (gnc:find-report-template uuid))
@ -245,10 +258,10 @@
(date-0 (gnc:get-start-this-month))
(date-1 (gnc:timepair-next-day date-0))
(date-2 (gnc:timepair-next-day date-1)))
(env-create-transaction env date-1 my-income-account my-asset-account (gnc:make-gnc-numeric -1 1))
(env-create-transaction env date-1 my-expense-account my-liability-account (gnc:make-gnc-numeric -1 1))
(env-create-transaction env date-2 my-income-account my-asset-account (gnc:make-gnc-numeric -5 1))
(env-create-transaction env date-2 my-expense-account my-liability-account (gnc:make-gnc-numeric -5 1))
(env-create-transaction env date-1 my-income-account my-asset-account -1/1)
(env-create-transaction env date-1 my-expense-account my-liability-account -1/1)
(env-create-transaction env date-2 my-income-account my-asset-account -5/1)
(env-create-transaction env date-2 my-expense-account my-liability-account -5/1)
(begin
(set-option report gnc:pagename-display "Show table" #t)
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
@ -270,7 +283,7 @@
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
result))))
(and (every (lambda (row)
(or (and (every (lambda (row)
(and (= (string->number (car (fourth row)))
(+ (string->number (car (second row)))
(string->number (car (third row)))))
@ -281,7 +294,9 @@
(= 1 (tbl-ref->number tbl 1 1))
(= 5 (tbl-ref->number tbl 2 1))
(= 3 (tbl-row-count tbl))
(= 4 (tbl-column-count tbl)))))))))
(= 4 (tbl-column-count tbl)))
(begin (format #t "two-txn-income test ~a failed~%" uuid) #f))
))))))
(define (closing-test uuid)
@ -306,12 +321,12 @@
(date-2 (gnc:timepair-next-day date-1))
(date-3 (gnc:timepair-next-day date-2)))
(env-create-transaction env date-1 my-income-account my-asset-account (gnc:make-gnc-numeric -1 1))
(env-create-transaction env date-2 my-income-account my-asset-account (gnc:make-gnc-numeric -2 1))
(env-create-transaction env date-3 my-income-account my-asset-account (gnc:make-gnc-numeric -3 1))
(env-create-transaction env date-1 my-income-account my-asset-account -1/1)
(env-create-transaction env date-2 my-income-account my-asset-account -2/1)
(env-create-transaction env date-3 my-income-account my-asset-account -3/1)
(let ((closing-txn (env-create-transaction env date-2 my-asset-account my-equity-account
(gnc:make-gnc-numeric 300 1))))
300/1)))
(xaccTransSetIsClosingTxn closing-txn #t))
(begin
@ -335,7 +350,7 @@
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1)
(list "<td class=\"number-cell\">[^0-9]*([^<]*)</td>" 1))
result))))
(and (every (lambda (row)
(or (and (every (lambda (row)
(and (= (string->number (car (fourth row)))
(+ (string->number (car (second row)))
(string->number (car (third row)))))))
@ -345,5 +360,7 @@
(= 2 (tbl-ref->number tbl 2 1))
(= 3 (tbl-ref->number tbl 3 1))
(= 4 (tbl-row-count tbl))
(= 4 (tbl-column-count tbl)))))))))
(= 4 (tbl-column-count tbl)))
(begin (format #t "Closing-txn test ~a failed~%" uuid) #f))
))))))

View File

@ -80,7 +80,7 @@
(gnc:get-start-this-month)
my-income-account
my-asset-account
(gnc:make-gnc-numeric -1 1))
-1/1)
(begin
(set-option report gnc:pagename-display "Show table" #t)
(set-option report gnc:pagename-general "Start Date"
@ -131,12 +131,12 @@
date-1
my-income-account
my-asset-account
(gnc:make-gnc-numeric -1 1))
-1/1)
(env-create-transaction env
date-2
my-income-account
my-asset-account
(gnc:make-gnc-numeric -5 1))
-5/1)
(begin
(set-option report gnc:pagename-display "Show table" #t)
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))
@ -187,10 +187,10 @@
(date-0 (gnc:get-start-this-month))
(date-1 (gnc:timepair-next-day date-0))
(date-2 (gnc:timepair-next-day date-1)))
(env-create-transaction env date-1 my-income-account my-asset-account (gnc:make-gnc-numeric -1 1))
(env-create-transaction env date-1 my-expense-account my-liability-account (gnc:make-gnc-numeric -1 1))
(env-create-transaction env date-2 my-income-account my-asset-account (gnc:make-gnc-numeric -5 1))
(env-create-transaction env date-2 my-expense-account my-liability-account (gnc:make-gnc-numeric -5 1))
(env-create-transaction env date-1 my-income-account my-asset-account -1/1)
(env-create-transaction env date-1 my-expense-account my-liability-account -1/1)
(env-create-transaction env date-2 my-income-account my-asset-account -5/1)
(env-create-transaction env date-2 my-expense-account my-liability-account -5/1)
(begin
(set-option report gnc:pagename-display "Show table" #t)
(set-option report gnc:pagename-general "Start Date" (cons 'absolute date-0))

View File

@ -409,7 +409,7 @@ new, totally cool report, consult the mailing list %s.")
(_ "The number option formatted as currency is %s.")
(gnc:html-markup-b
(xaccPrintAmount
(gnc:make-gnc-numeric (inexact->exact num-val) 1)
(inexact->exact num-val)
(gnc-default-print-info #f)))))))
;; you can add as many objects as you want. Here's another

View File

@ -218,7 +218,7 @@ gnc_euro_currency_get_rate (const gnc_commodity *currency)
return gnc_numeric_zero ();
return double_to_gnc_numeric (result->rate, GNC_DENOM_AUTO,
GNC_HOW_DENOM_SIGFIGS(6) | GNC_HOW_RND_ROUND_HALF_UP);
GNC_HOW_RND_ROUND_HALF_UP);
}
/* ------------------------------------------------------ */

View File

@ -520,7 +520,7 @@ gnc_split_scm_get_amount(SCM split_scm)
return gnc_numeric_zero ();
result = scm_call_1(getters.split_scm_amount, split_scm);
if (!gnc_numeric_p(result))
if (!scm_rational_p(result))
return gnc_numeric_zero ();
return gnc_scm_to_numeric(result);
@ -545,7 +545,7 @@ gnc_split_scm_get_value(SCM split_scm)
return gnc_numeric_zero ();
result = scm_call_1(getters.split_scm_value, split_scm);
if (!gnc_numeric_p(result))
if (!scm_rational_p(result))
return gnc_numeric_zero ();
return gnc_scm_to_numeric(result);

View File

@ -50,11 +50,8 @@ GSList * gnc_query_scm2path (SCM path_scm);
SCM gnc_query2scm (QofQuery * q);
QofQuery * gnc_scm2query (SCM query_scm);
int gnc_gh_gint64_p(SCM num);
SCM gnc_numeric_to_scm(gnc_numeric arg);
gnc_numeric gnc_scm_to_numeric(SCM arg);
int gnc_numeric_p(SCM arg);
gnc_commodity * gnc_scm_to_commodity(SCM scm);
SCM gnc_commodity_to_scm (const gnc_commodity *commodity);
SCM gnc_book_to_scm (const QofBook *book);

View File

@ -319,8 +319,8 @@ int
gnc_timepair_p(SCM x)
{
return(scm_is_pair(x) &&
gnc_gh_gint64_p(SCM_CAR(x)) &&
gnc_gh_gint64_p(SCM_CDR(x)));
(scm_is_signed_integer(SCM_CAR(x), INT64_MIN, INT64_MAX) &&
scm_is_signed_integer(SCM_CDR(x), INT64_MIN, INT64_MAX)));
}
SCM
@ -1110,10 +1110,8 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
break;
scm = SCM_CAR (query_term_scm);
query_term_scm = SCM_CDR (query_term_scm);
amount = scm_to_double (scm);
val = double_to_gnc_numeric (amount, GNC_DENOM_AUTO,
GNC_HOW_DENOM_SIGFIGS(6) | GNC_HOW_RND_ROUND_HALF_UP);
val = gnc_numeric_create (scm_to_int64(scm_numerator(scm)),
scm_to_int64(scm_denominator(scm)));
if (!g_strcmp0 (pr_type, "pr-price"))
{
@ -1997,96 +1995,23 @@ gnc_scm2query (SCM query_scm)
return q;
}
int
gnc_gh_gint64_p(SCM num)
{
static int initialized = 0;
static SCM maxval;
static SCM minval;
if (!initialized)
{
/* to be super safe, we have to build these manually because
though we know that we have gint64's here, we *don't* know how
to portably specify a 64bit constant to the compiler (i.e. like
0x7FFFFFFFFFFFFFFF). */
gint64 tmp;
tmp = 0x7FFFFFFF;
tmp <<= 32;
tmp |= 0xFFFFFFFF;
maxval = scm_from_int64(tmp);
tmp = 0x80000000;
tmp <<= 32;
minval = scm_from_int64(tmp);
scm_gc_protect_object(maxval);
scm_gc_protect_object(minval);
initialized = 1;
}
return (scm_is_exact(num) &&
(scm_geq_p(num, minval) != SCM_BOOL_F) &&
(scm_leq_p(num, maxval) != SCM_BOOL_F));
}
gnc_numeric
gnc_scm_to_numeric(SCM gncnum)
{
static SCM get_num = SCM_BOOL_F;
static SCM get_denom = SCM_BOOL_F;
if (get_num == SCM_BOOL_F)
{
get_num = scm_c_eval_string("gnc:gnc-numeric-num");
}
if (get_denom == SCM_BOOL_F)
{
get_denom = scm_c_eval_string("gnc:gnc-numeric-denom");
}
return gnc_numeric_create(scm_to_int64(scm_call_1(get_num, gncnum)),
scm_to_int64(scm_call_1(get_denom, gncnum)));
if (scm_is_signed_integer(scm_numerator(gncnum), INT64_MIN, INT64_MAX) &&
scm_is_signed_integer(scm_denominator(gncnum), INT64_MIN, INT64_MAX))
return gnc_numeric_create(scm_to_int64(scm_numerator(gncnum)),
scm_to_int64(scm_denominator(gncnum)));
return gnc_numeric_create(0, GNC_ERROR_OVERFLOW);
}
SCM
gnc_numeric_to_scm(gnc_numeric arg)
{
static SCM maker = SCM_BOOL_F;
if (maker == SCM_BOOL_F)
{
maker = scm_c_eval_string("gnc:make-gnc-numeric");
}
return scm_call_2(maker, scm_from_int64(gnc_numeric_num(arg)),
scm_from_int64(gnc_numeric_denom(arg)));
return scm_divide(scm_from_int64(arg.num),
scm_from_int64(arg.denom));
}
int
gnc_numeric_p(SCM arg)
{
static SCM type_p = SCM_BOOL_F;
SCM ret = SCM_BOOL_F;
if (type_p == SCM_BOOL_F)
{
type_p = scm_c_eval_string("gnc:gnc-numeric?");
}
ret = scm_call_1(type_p, arg);
if (ret == SCM_BOOL_F)
{
return FALSE;
}
else
{
return TRUE;
}
}
static SCM
gnc_generic_to_scm(const void *cx, const gchar *type_str)
{

View File

@ -43,12 +43,6 @@
(export GNC-ERROR-OVERFLOW)
(export GNC-ERROR-DENOM-DIFF)
(export GNC-ERROR-REMAINDER)
(export <gnc-numeric>)
(export gnc:gnc-numeric?)
(export gnc:make-gnc-numeric)
(export gnc:gnc-numeric-denom)
(export gnc:gnc-numeric-num)
(export gnc:gnc-numeric-denom-reciprocal)
(export <gnc-monetary>)
(export gnc:gnc-monetary?)
(export gnc:make-gnc-monetary)

View File

@ -47,26 +47,6 @@
(define GNC-ERROR-DENOM-DIFF -3)
(define GNC-ERROR-REMAINDER -4)
(define <gnc-numeric>
(make-record-type "<gnc-numeric>"
'(num denom)))
(define gnc:make-gnc-numeric
(record-constructor <gnc-numeric>))
(define gnc:gnc-numeric?
(record-predicate <gnc-numeric>))
(define gnc:gnc-numeric-num
(record-accessor <gnc-numeric> 'num))
(define gnc:gnc-numeric-denom
(record-accessor <gnc-numeric> 'denom))
(define (gnc:gnc-numeric-denom-reciprocal arg)
(- arg))
(define <gnc-monetary>
(make-record-type "<gnc-monetary>"
@ -76,7 +56,7 @@
(define (gnc:make-gnc-monetary c a)
;;FIXME: we used to type-check the values, like:
;; (gw:wcp-is-of-type? <gnc:commodity*> c)
(if (and #t (gnc:gnc-numeric? a))
(if (and #t (number? a))
((record-constructor <gnc-monetary>) c a)
(warn "wrong arguments for gnc:make-gnc-monetary: " c a)))

View File

@ -25,22 +25,26 @@ extern "C"
KvpValue *
gnc_scm_to_kvp_value_ptr(SCM val)
{
if (scm_is_number(val))
if (scm_is_rational(val))
{
/* in guile 1.8 (exact? ) only works on numbers */
if (scm_is_exact (val) && gnc_gh_gint64_p(val))
if (scm_is_exact_integer(val) &&
scm_is_signed_integer(val, INT64_MIN, INT64_MAX))
{
return new KvpValue{scm_to_int64(val)};
}
else if (scm_is_exact(val) &&
scm_is_signed_integer(scm_numerator(val),
INT64_MIN, INT64_MAX) &&
scm_is_signed_integer(scm_denominator(val),
INT64_MIN, INT64_MAX))
{
return new KvpValue{gnc_scm_to_numeric(val)};
}
else
{
return new KvpValue{scm_to_double(val)};
}
}
else if (gnc_numeric_p(val))
{
return new KvpValue{gnc_scm_to_numeric(val)};
}
else if (gnc_guid_p(val))
{
auto guid = gnc_scm2guid(val);

View File

@ -115,7 +115,7 @@
(cons 'sink (make-test-sink))))
(define (env-random-amount env n)
(gnc:make-gnc-numeric (env-random env n) 1))
(/ (env-random env n) 1))
(define (env-random env n)
(random n (assoc-ref env 'random)))
@ -183,9 +183,9 @@
(for-each (lambda (date)
(env-create-transaction env date to-account
from-account
(gnc:make-gnc-numeric
(gnc:date-get-month-day (gnc:timepair->date date))
1)))
(/
(gnc:date-get-month-day (gnc:timepair->date date))
1)))
(cdr (reverse dates-this-month)))))
(define (env-create-account-structure env account-structure)

View File

@ -17,8 +17,8 @@
(bank-account (cdr (assoc "Bank" account-alist)))
(expense-account (cdr (assoc "Expenses" account-alist)))
(wallet-account (cdr (assoc "Wallet" account-alist)))
(tx1 (env-create-transaction env today bank-account wallet-account (gnc:make-gnc-numeric 20 1)))
(tx2 (env-create-transaction env today bank-account expense-account (gnc:make-gnc-numeric 10 1)))
(tx1 (env-create-transaction env today bank-account wallet-account 20/1))
(tx2 (env-create-transaction env today bank-account expense-account 10/1))
(splits-tx1 (xaccTransGetSplitList tx1))
(splits-tx2 (xaccTransGetSplitList tx2)))
(and (split-in-list? (first splits-tx1) splits-tx1)