Browse files

Revert "MDL-33105 flexible apply_units() function"

This reverts commit c2ba178.
  • Loading branch information...
1 parent 2c8d31c commit 8d81f4f4cc7363a77dfcf1c2da984af07e067d53 @danpoltawski danpoltawski committed Jan 31, 2013
View
11 question/type/numerical/question.php
@@ -106,6 +106,10 @@ public function is_complete_response(array $response) {
return false;
}
+ if ($this->ap->contains_thousands_seaparator($response['answer'])) {
+ return false;
+ }
+
return true;
}
@@ -127,6 +131,11 @@ public function get_validation_error(array $response) {
return get_string('unitnotselected', 'qtype_numerical');
}
+ if ($this->ap->contains_thousands_seaparator($response['answer'])) {
+ return get_string('pleaseenteranswerwithoutthousandssep', 'qtype_numerical',
+ $this->ap->get_separator());
+ }
+
return '';
}
@@ -278,7 +287,7 @@ public function check_file_access($qa, $options, $component, $filearea, $args,
list($value, $unit, $multiplier) = $this->ap->apply_units(
$currentanswer, $selectedunit);
$answer = $this->get_matching_answer($value, $multiplier);
- $answerid = reset($args); // Itemid is answer id.
+ $answerid = reset($args); // itemid is answer id.
return $options->feedback && $answer && $answerid == $answer->id;
} else if ($component == 'question' && $filearea == 'hint') {
View
52 question/type/numerical/questiontype.php
@@ -75,8 +75,8 @@ public function get_question_options($question) {
array('questionid' => $question->id), 'id ASC');
$this->get_numerical_units($question);
- // Function get_numerical_options() need to know if there are units
- // to set correctly default values.
+ // get_numerical_options() need to know if there are units
+ // to set correctly default values
$this->get_numerical_options($question);
// If units are defined we strip off the default unit from the answer, if
@@ -153,7 +153,7 @@ public function save_question_options($question) {
global $DB;
$context = $question->context;
- // Get old versions of the objects.
+ // Get old versions of the objects
$oldanswers = $DB->get_records('question_answers',
array('question' => $question->id), 'id ASC');
$oldoptions = $DB->get_records('question_numerical',
@@ -167,7 +167,7 @@ public function save_question_options($question) {
$units = $result->units;
}
- // Insert all the new answers.
+ // Insert all the new answers
foreach ($question->answer as $key => $answerdata) {
// Check for, and ingore, completely blank answer from the form.
if (trim($answerdata) == '' && $question->fraction[$key] == 0 &&
@@ -200,7 +200,7 @@ public function save_question_options($question) {
$answer->feedbackformat = $question->feedback[$key]['format'];
$DB->update_record('question_answers', $answer);
- // Set up the options object.
+ // Set up the options object
if (!$options = array_shift($oldoptions)) {
$options = new stdClass();
}
@@ -323,7 +323,7 @@ public function save_units($question) {
$units = array();
$unitalreadyinsert = array();
foreach ($question->multiplier as $i => $multiplier) {
- // Discard any unit which doesn't specify the unit or the multiplier.
+ // Discard any unit which doesn't specify the unit or the multiplier
if (!empty($question->multiplier[$i]) && !empty($question->unit[$i]) &&
!array_key_exists($question->unit[$i], $unitalreadyinsert)) {
$unitalreadyinsert[$question->unit[$i]] = 1;
@@ -632,35 +632,17 @@ public function apply_units($response, $separateunit = null) {
// Strip spaces (which may be thousands separators) and change other forms
// of writing e to e.
$response = str_replace(' ', '', $response);
- // Strip thousand separators like half space.
- if (!in_array($this->thousandssep, array(',', '.', ' '))) {
- if (strpos($value, $this->thousandssep) !== false) {
- $response = str_replace($this->thousandssep, '', $response);
- }
- }
$response = preg_replace('~(?:e|E|(?:x|\*|×)10(?:\^|\*\*))([+-]?\d+)~', 'e$1', $response);
- // Dot . is mostly a decimal separator there a few exceptions where it is a thousand separator
- // If a . is present or there are multiple , (i.e. 2,456,789 ) assume,
- // is a thousands separator and strip it or else assume it is a decimal
- // separator and change it to .
- // if only one and it is , then change to .
- if (substr_count($response, ',')+ substr_count($response, '.') == 1 ) {
- if (strpos($response, ',') !== false) {
- $response = str_replace(',', '.', $response);
- }
- } else if (substr_count($response, ',') == 1 && substr_count($response, '.') == 1) {
- if (strpos($response, '.') > strpos($response, ',')) { // Then , is thousand.
- $response = str_replace(',', '', $response);
- } else {
- $response = str_replace('.', '', $response);
- $response = str_replace(',', '.', $response);
- }
- } else if (substr_count($response, ',') > 1) {
- $response = str_replace(',', '', $response);
- } else if (substr_count($response, '.') > 1) {
- $response = str_replace('.', '', $response);
- $response = str_replace(',', '.', $response);
+
+ // If a . is present or there are multiple , (i.e. 2,456,789 ) assume ,
+ // is a thouseands separator, and strip it, else assume it is a decimal
+ // separator, and change it to ..
+ if (strpos($response, '.') !== false || substr_count($response, ',') > 1) {
+ $response = str_replace(',', '', $response);
+ } else {
+ $response = str_replace(',', '.', $response);
}
+
$regex = '[+-]?(?:\d+(?:\\.\d*)?|\\.\d+)(?:e[-+]?\d+)?';
if ($this->unitsbefore) {
$regex = "/$regex$/";
@@ -673,7 +655,7 @@ public function apply_units($response, $separateunit = null) {
$numberstring = $matches[0];
if ($this->unitsbefore) {
- // Function substr returns false when it means '', so cast back to string.
+ // substr returns false when it means '', so cast back to string.
$unit = (string) substr($response, 0, -strlen($numberstring));
} else {
$unit = (string) substr($response, strlen($numberstring));
@@ -689,7 +671,7 @@ public function apply_units($response, $separateunit = null) {
$multiplier = null;
}
- return array($numberstring + 0, $unit, $multiplier); // Add + 0 to convert to number.
+ return array($numberstring + 0, $unit, $multiplier); // + 0 to convert to number.
}
/**
View
19 question/type/numerical/tests/answerprocessor_test.php
@@ -131,28 +131,9 @@ public function test_euro_style() {
$ap = new qtype_numerical_answer_processor(array(), false, ',', ' ');
$this->assertEquals(array(-1000, '', null), $ap->apply_units('-1 000'));
- $this->assertEquals(array(-1000000, '', null), $ap->apply_units('-1 000 000'));
- $this->assertEquals(array(-1000000, '', null), $ap->apply_units('-1.000.000'));
- $this->assertEquals(array(-1000000, '', null), $ap->apply_units('-1,000,000'));
- $this->assertEquals(array(-1000.1, '', null), $ap->apply_units('-1000,1'));
- $this->assertEquals(array(-1000.1, '', null), $ap->apply_units('-1.000,1'));
- $this->assertEquals(array(-1000.1, '', null), $ap->apply_units('-1,000.1'));
$this->assertEquals(array(3.14159, '', null), $ap->apply_units('3,14159'));
}
- public function test_deutsch_style() {
- $ap = new qtype_numerical_answer_processor(array(), false, ',', '.');
-
- $this->assertEquals(array(-1000, '', null), $ap->apply_units('-1 000'));
- $this->assertEquals(array(-1000000, '', null), $ap->apply_units('-1 000 000'));
- $this->assertEquals(array(-1000000, '', null), $ap->apply_units('-1.000.000'));
- $this->assertEquals(array(-1000000, '', null), $ap->apply_units('-1.000.000,'));
- $this->assertEquals(array(-1000.1, '', null), $ap->apply_units('-1000,1'));
- $this->assertEquals(array(-1000.1, '', null), $ap->apply_units('-1.000,1'));
- $this->assertEquals(array(-1000.1, '', null), $ap->apply_units('-1,000.1'));
- $this->assertEquals(array(3.14159, '', null), $ap->apply_units('3.14159'));
- $this->assertEquals(array(3.14159, '', null), $ap->apply_units('3,14159'));
- }
public function test_percent() {
$ap = new qtype_numerical_answer_processor(array('%' => 100), false, '.', ',');

0 comments on commit 8d81f4f

Please sign in to comment.