- my (@mve)= $parse_numeric->($rhs, 0);
- ${ $h->{Emsg} }= $mve[2] if defined $mve[2];
- unshift @{ $h->{'deltas'} }, [ @mve,$signum,$signopstr ];
+ my @mveco;
+ if ($rhs =~ m/^\s*(\d{1,2}(?:\.\d{0,4})?)\%\s*$/) {
+ my $pct= 100.0 + $signum * $1;
+ @mveco= ($pct,$pct,undef);
+ push @mveco, sprintf "%s %g%%", $signopstr, $1;
+ push @mveco, sub {
+ return undef unless defined $_[0];
+ $_[0] * $_[1] / 100.0
+ };
+ } else {
+ @mveco= $parse_numeric->($rhs, 0);
+ if (!defined $mveco[2]) {
+ push @mveco, $signopstr.' '.$canon_numeric->(@mveco);
+ push @mveco, sub {
+ ${ $h->{Emsg} }= "Cannot add or subtract".
+ " mass to/from volume"
+ unless defined $_[0];
+ $_[0] + $_[1] * $signum
+ };
+ }
+ }
+ ${ $h->{Emsg} }= $mveco[2] if defined $mveco[2];
+ unshift @{ $h->{'deltas'} }, [ @mveco ];