emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Carsten Dominik <dominik@science.uva.nl>
To: Cecil Westerhof <CecilWesterhof@xs4all.nl>
Cc: org-mode <emacs-orgmode@gnu.org>
Subject: Re: how to clear computed values
Date: Wed, 11 Jul 2007 08:15:25 +0200	[thread overview]
Message-ID: <93de834e13e5289b11185b67cf4162b0@science.uva.nl> (raw)
In-Reply-To: <1184092729.6283.91.camel@Barebusta.DecebalComp>


On Jul 10, 2007, at 20:38, Cecil Westerhof wrote:

> I have a table like:
>         
> |---------+---------+---------+--------+-------+----------+--------|
>         | kmstand |    km's | prijs/l | liters | prijs | prijs/km |   
> km/l |
>         
> |---------+---------+---------+--------+-------+----------+--------|
>         |  155111 |       0 |         |        |  0.00 |   -0.000 |  
> 0.000 |
>         |  156146 |    1035 |   102.2 |  62.25 | 63.62 |    6.147 | 
> 16.627 |
>         |         | -156146 |         |        |  0.00 |   -0.000 |  
> 0.000 |
>         
> |---------+---------+---------+--------+-------+----------+--------|
>         #+TBLFM: $2='(and @-1$-1 $1 (- $1 @-1$-1));N::$5='(and $3 $4 
> (/ (* $3 $4) 100));N%.2f::$6='(and $2 $5 (/ (* $5 100) 
> $2));N%.3f::$7='(and $2 $4 (/ $2 $4));N%.3f
>
> When there is nothing to display, there is now a '0' displayed, but I
> would prefer it to be empty. Is this possible?
> Also, why is prijs/km displayed as '-0.000'?
> And why is the last field of km's displayed as  '-156146'? I expected
> '0'.

If you want to understand why things come out the way they
do, use formular debugging (this is an option in the menu, but
cou can also toggle it with `C-C {').  When you then execute
calculations in the table (for example with `C-u C-c C-c')
you will get detailed information about variable substitution,
and you will see the final expression that gets evaluated.

For example, you are trying things like

   (and $1 $2 ...

but of course both the empty string and the number 0 are
"true" in Lisp, the only thing false in Lisp is "nil".

If you want to fix it, you can, by *really* taking control.
For example, define the following function that tests
if a value is not zero

(defun nz (n) (not (= n 0.)))

and then write your table like this:

   |---------+------+---------+--------+-------+----------+--------|
   | kmstand | km's | prijs/l | liters | prijs | prijs/km |   km/l |
   |---------+------+---------+--------+-------+----------+--------|
   |  155111 |      |         |        |       |          |        |
   |  156146 | 1035 |   102.2 |  62.25 | 63.62 |    6.147 | 16.627 |
   |         |      |         |        |       |          |        |
   |---------+------+---------+--------+-------+----------+--------|
#+TBLFM: $2='(if (and (nz @-1$-1) (nz $1) (> $1 @-1$-1)) (- $1 @-1$-1) 
"");N::$5='(if (and (nz $3) (nz $4)) (format "%.2f" (/ (* $3 $4) 100)) 
"");N::$6='(if (and (nz $2) (nz $5)) (format "%.3f" (/ (* $5 100) $2)) 
"");N::$7='(if (and (nz $2) (nz $4)) (format "%.3f" (/ $2 $4)) "");N

Yes, those equations look longish - use the formula
editor to edit them.

Also, consider to put the "#" marker in the first column,
to get this table to recompute automatically while
you step through with TAB.  Use C-# in the first data line
to insert the "#" if you want to make sure that your
existing formulas are modified to reflect the new
column numbers.  The result will be this:

   |---+---------+------+---------+--------+-------+----------+--------|
   |   | kmstand | km's | prijs/l | liters | prijs | prijs/km |   km/l |
   |---+---------+------+---------+--------+-------+----------+--------|
   | # |  155111 |      |         |        |       |          |        |
   | # |  156146 | 1035 |   102.2 |  62.25 | 63.62 |    6.147 | 16.627 |
   | # |         |      |         |        |       |          |        |
   |---+---------+------+---------+--------+-------+----------+--------|
#+TBLFM: $3='(if (and (nz @-1$-1) (nz $2) (> $2 @-1$-1)) (- $2 @-1$-1) 
"");N::$6='(if (and (nz $4) (nz $5)) (format "%.2f" (/ (* $4 $5) 100)) 
"");N::$7='(if (and (nz $3) (nz $6)) (format "%.3f" (/ (* $6 100) $3)) 
"");N::$8='(if (and (nz $3) (nz $5)) (format "%.3f" (/ $3 $5)) "");N

Hope this helps.

- Carsten

--
Carsten Dominik
Sterrenkundig Instituut "Anton Pannekoek"
Universiteit van Amsterdam
Kruislaan 403
NL-1098SJ Amsterdam
phone: +31 20 525 7477

  reply	other threads:[~2007-07-11  7:17 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-10 18:38 how to clear computed values Cecil Westerhof
2007-07-11  6:15 ` Carsten Dominik [this message]
2007-07-11  8:26   ` Cecil Westerhof
2007-07-11  8:49     ` Carsten Dominik
2007-07-11  9:02       ` Cecil Westerhof
2007-07-11 10:19         ` Carsten Dominik
2007-07-11 11:02           ` Cecil Westerhof
2007-07-11 11:21             ` Carsten Dominik
2007-07-11  7:22 ` Cecil Westerhof

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=93de834e13e5289b11185b67cf4162b0@science.uva.nl \
    --to=dominik@science.uva.nl \
    --cc=CecilWesterhof@xs4all.nl \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).