--- loncom/homework/default_homework.lcpm 2014/06/24 17:02:33 1.165 +++ loncom/homework/default_homework.lcpm 2014/06/25 15:43:04 1.168 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() # -# $Id: default_homework.lcpm,v 1.165 2014/06/24 17:02:33 raeburn Exp $ +# $Id: default_homework.lcpm,v 1.168 2014/06/25 15:43:04 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1045,9 +1045,25 @@ sub format_significant_figures { my $numSig = $xint*10**($x10-$sig+$power); if ($numSig =~ /^(\d+)\.(\d+)/) { # insert trailing zero's if have decimal point + my @digarray = split('',$1.$2); + my $sigcount; + while (@digarray > 0) { + my $item = shift(@digarray); + if ($item) { + $sigcount = 1 + @digarray; + last; + } + } + if (($sigcount) && ($sig >= $sigcount)) { + $zeros = substr($zeros,0,($sig - $sigcount)); + } $numSig =~ s/^(\d+)\.(\d+)(\e?(.*)?)$/$1\.$2$zeros$3/; } else { - if ($numSig =~ /0$/) { + if ($numSig =~ /^(\d+)e([\+\-]\d+)$/i) { + my $pre_exp = $1; + my $exponent = $2; + $numSig = $pre_exp.'.'.$zeros.'E'.$exponent; + } elsif ($numSig =~ /0$/) { # add decimal pt for number ending with 0 and length == # of sig figs if (length($numSig) == $sig) { $numSig.='.'; @@ -1055,12 +1071,15 @@ sub format_significant_figures { # exponential form for number ending with 0 and length > # of sig figs my $fmtsig = $sig-1; if ($fmtsig) { - $numSig = sprintf('%.'.$fmtsig.'e',$numSig); + $numSig = sprintf('%.'.$fmtsig.'E',$numSig); } + } elsif (length($numSig) < $sig) { + $numSig.='.'.substr($zeros,0,($sig-length($numSig))); + } + } else { + if (length($numSig) < $sig) { + $numSig.='.'.substr($zeros,0,($sig-length($numSig))); } - } - if (length($numSig) < $sig) { - $numSig.='.'.substr($zeros,0,($sig-length($numSig))); } } # return number with sign @@ -1214,13 +1233,27 @@ sub submission { if ($subnumber) { $sub=$subnumber.':'; } my $output = &EXT('user.resource.'.$sub.'resource.'.$partid.'.'.$responseid.'.submission'); - if ($encode) { - $output =~ s/&/&/g; - $output =~ s//>/g; - $output =~ s/"/"/g; + if (ref($output) eq 'ARRAY') { + my @items = @{$output}; + if ($encode) { + @items = map { &encode_response($_); } @items; + } + return \@items; + } else { + if ($encode) { + $output = &encode_response($output); + } + return $output; } - return $output; +} + +sub encode_response { + my ($value) = @_; + $value =~ s/&/&/g; + $value =~ s//>/g; + $value =~ s/"/"/g; + return $value; } sub currentpart {