/** * Parse weight dimension * @param string $ps_value value to parse * @param null|array $pa_options options array * @return bool|null|Zend_Measure_Weight * @throws Exception */ function caParseWeightDimension($ps_value, $pa_options = null) { global $g_ui_locale; $vs_locale = caGetOption('locale', $pa_options, $g_ui_locale); $pa_values = array(caConvertFractionalNumberToDecimal(trim($ps_value), $vs_locale)); $vo_parsed_measurement = null; while ($vs_expression = array_shift($pa_values)) { // parse units of measurement if (preg_match("!^([\\d\\.\\,/ ]+)[ ]*([^\\d ]+)!", $vs_expression, $va_matches)) { $vs_value = trim($va_matches[1]); $va_values = explode(" ", $vs_value); if ($vs_expression = trim(str_replace($va_matches[0], '', $vs_expression))) { array_unshift($pa_values, $vs_expression); } $vs_value = 0; foreach ($va_values as $vs_v) { $vs_value += caConvertLocaleSpecificFloat(trim($vs_v), $vs_locale); } switch (strtolower($va_matches[2])) { case "lbs": case 'lbs.': case 'lb': case 'lb.': case 'pound': case 'pounds': $vs_units = Zend_Measure_Weight::POUND; break; case 'kg': case 'kg.': case 'kilo': case 'kilos': case 'kilogram': case 'kilograms': $vs_units = Zend_Measure_Weight::KILOGRAM; break; case 'g': case 'g.': case 'gr': case 'gr.': case 'gram': case 'grams': $vs_units = Zend_Measure_Weight::GRAM; break; case 'mg': case 'mg.': case 'milligram': case 'milligrams': $vs_units = Zend_Measure_Weight::MILLIGRAM; break; case 'oz': case 'oz.': case 'ounce': case 'ounces': $vs_units = Zend_Measure_Weight::OUNCE; break; case 'ton': case 'tons': case 'tonne': case 'tonnes': case 't': case 't.': $vs_units = Zend_Measure_Weight::TON; break; case 'stone': $vs_units = Zend_Measure_Weight::STONE; break; default: throw new Exception(_t('Not a valid unit of weight [%2]', $ps_value)); break; } try { $o_tmp = new Zend_Measure_Weight($vs_value, $vs_units, $vs_locale); } catch (Exception $e) { throw new Exception(_t('Not a valid measurement')); } if ($o_tmp->getValue() < 0) { // weight can't be negative in our universe throw new Exception(_t('Must not be less than zero')); } if ($vo_parsed_measurement) { $vo_parsed_measurement = $vo_parsed_measurement->add($o_tmp); } else { $vo_parsed_measurement = $o_tmp; } } } if (!$vo_parsed_measurement) { throw new Exception(_t('Not a valid measurement [%1]', $ps_value)); } return $vo_parsed_measurement; }
public function parseValue($ps_value, $pa_element_info, $pa_options = null) { $ps_value = trim($ps_value); global $g_ui_locale; $va_settings = $this->getSettingValuesFromElementArray($pa_element_info, array('requireValue')); if (!$va_settings['requireValue'] && !trim($ps_value)) { return array('value_longtext1' => '', 'value_longtext2' => '', 'value_decimal1' => ''); } // parse units of measurement if (preg_match("!^([\\d\\.\\,/ ]+)[ ]*([^\\d ]+)!", $ps_value, $va_matches)) { $va_values = explode(" ", $va_matches[1]); $vs_value = 0; foreach ($va_values as $vs_v) { $vs_value += caConvertFractionalNumberToDecimal(trim($vs_v)); } switch (strtolower($va_matches[2])) { case "lbs": case 'lbs.': case 'lb': case 'lb.': case 'pound': case 'pounds': $vs_units = Zend_Measure_Weight::POUND; break; case 'kg': case 'kg.': case 'kilo': case 'kilos': case 'kilogram': case 'kilograms': $vs_units = Zend_Measure_Weight::KILOGRAM; break; case 'g': case 'g.': case 'gr': case 'gr.': case 'gram': case 'grams': $vs_units = Zend_Measure_Weight::GRAM; break; case 'mg': case 'mg.': case 'milligram': case 'milligrams': $vs_units = Zend_Measure_Weight::MILLIGRAM; break; case 'oz': case 'oz.': case 'ounce': case 'ounces': $vs_units = Zend_Measure_Weight::OUNCE; break; case 'ton': case 'tons': case 'tonne': case 'tonnes': case 't': case 't.': $vs_units = Zend_Measure_Weight::TON; break; case 'stone': $vs_units = Zend_Measure_Weight::STONE; break; default: $this->postError(1970, _t('%1 is not a valid unit of weight [%2]', $va_matches[2], $ps_value), 'WeightAttributeValue->parseValue()'); return false; break; } } else { $this->postError(1970, _t('%1 is not a valid measurement', $pa_element_info['displayLabel']), 'WeightAttributeValue->parseValue()'); return false; } try { $vo_parsed_measurement = new Zend_Measure_Weight($vs_value, $vs_units, $g_ui_locale); } catch (Exception $e) { $this->postError(1970, _t('%1 is not a valid measurement', $pa_element_info['displayLabel']), 'WeightAttributeValue->parseValue()'); return false; } if ($vo_parsed_measurement->getValue() < 0) { // Weight can't be negative in our universe // (at least I believe in *something*) $this->postError(1970, _t('%1 must not be less than zero', $pa_element_info['displayLabel']), 'WeightAttributeValue->parseValue()'); return false; } return array('value_longtext1' => $vo_parsed_measurement->toString(), 'value_longtext2' => $vs_units, 'value_decimal1' => $vo_parsed_measurement->convertTo('KILOGRAM', 6, 'en_US')); }
public function parseValue($ps_value, $pa_element_info, $pa_options = null) { global $g_ui_locale; $ps_value = caConvertFractionalNumberToDecimal(trim($ps_value), $g_ui_locale); $va_settings = $this->getSettingValuesFromElementArray($pa_element_info, array('requireValue')); if (!$va_settings['requireValue'] && !$ps_value) { return array('value_longtext1' => '', 'value_longtext2' => '', 'value_decimal1' => ''); } try { $vo_parsed_measurement = caParseLengthDimension($ps_value); } catch (Exception $e) { $this->postError(1970, _t('%1 is not a valid measurement', $pa_element_info['displayLabel']), 'WeightAttributeValue->parseValue()'); return false; } return array('value_longtext1' => $vo_parsed_measurement->toString(4), 'value_longtext2' => $vo_parsed_measurement->getType(), 'value_decimal1' => $vo_parsed_measurement->convertTo('METER', 6, 'en_US')); }
public function parseValue($ps_value, $pa_element_info, $pa_options = null) { global $g_ui_locale; $ps_value = caConvertFractionalNumberToDecimal(trim($ps_value), $g_ui_locale); $va_settings = $this->getSettingValuesFromElementArray($pa_element_info, array('requireValue')); if (!$va_settings['requireValue'] && !$ps_value) { return array('value_longtext1' => '', 'value_longtext2' => '', 'value_decimal1' => ''); } $vo_parsed_measurement = null; $pa_values = array($ps_value); while ($vs_expression = array_shift($pa_values)) { // parse units of measurement if (preg_match("!^([\\d\\.\\,/ ]+)[ ]*([^\\d ]+)!", $vs_expression, $va_matches)) { $vs_value = trim($va_matches[1]); $va_values = explode(" ", $vs_value); $vs_unit_expression = strtolower(trim($va_matches[2])); if ($vs_expression = trim(str_replace($va_matches[0], '', $vs_expression))) { array_unshift($pa_values, $vs_expression); } $vs_value = 0; foreach ($va_values as $vs_v) { $vs_value += caConvertLocaleSpecificFloat(trim($vs_v), $g_ui_locale); } switch ($vs_unit_expression) { case "'": case "’": case 'ft': case 'ft.': case 'feet': case 'foot': $vs_units = Zend_Measure_Length::FEET; break; case '"': case "”": case 'in': case 'in.': case 'inch': case 'inches': $vs_units = Zend_Measure_Length::INCH; break; case 'm': case 'm.': case 'meter': case 'meters': case 'metre': case 'metres': case 'mt': $vs_units = Zend_Measure_Length::METER; break; case 'cm': case 'cm.': case 'centimeter': case 'centimeters': case 'centimetre': case 'centimetres': $vs_units = Zend_Measure_Length::CENTIMETER; break; case 'mm': case 'mm.': case 'millimeter': case 'millimeters': case 'millimetre': case 'millimetres': $vs_units = Zend_Measure_Length::MILLIMETER; break; case 'point': case 'pt': case 'pt.': $vs_units = Zend_Measure_Length::POINT; break; case 'mile': case 'miles': $vs_units = Zend_Measure_Length::MILE; break; case 'km': case 'k': case 'kilometer': case 'kilometers': case 'kilometre': case 'kilometres': $vs_units = Zend_Measure_Length::KILOMETER; break; default: $this->postError(1970, _t('%1 is not a valid unit of length [%2]', $va_matches[2], $ps_value), 'LengthAttributeValue->parseValue()'); return false; break; } try { $o_tmp = new Zend_Measure_Length($vs_value, $vs_units, $g_ui_locale); } catch (Exception $e) { $this->postError(1970, _t('%1 is not a valid measurement', $pa_element_info['displayLabel']), 'LengthAttributeValue->parseValue()'); return false; } if ($o_tmp->getValue() < 0) { // length can't be negative in our universe $this->postError(1970, _t('%1 must not be less than zero', $pa_element_info['displayLabel']), 'LengthAttributeValue->parseValue()'); return false; } if ($vo_parsed_measurement) { $vo_parsed_measurement = $vo_parsed_measurement->add($o_tmp); } else { $vo_parsed_measurement = $o_tmp; } } } if (!$vo_parsed_measurement) { $this->postError(1970, _t('%1 is not a valid measurement [%2]', $pa_element_info['displayLabel'], $ps_value), 'LengthAttributeValue->parseValue()'); return false; } return array('value_longtext1' => $vo_parsed_measurement->toString(4), 'value_longtext2' => $vs_units, 'value_decimal1' => $vo_parsed_measurement->convertTo('METER', 6, 'en_US')); }