CPS-70: Fix display value for money radio field
authorivan <ivan@compucorp.co.uk>
Tue, 7 Apr 2020 11:50:53 +0000 (14:50 +0300)
committerIvan Klochko <ivan@compucorp.co.uk>
Fri, 12 Jun 2020 15:03:50 +0000 (18:03 +0300)
CRM/Core/BAO/CustomField.php

index d7d1fc3cd33229fe02ffef36c4c409f7f4054b12..d3af4d5a1836abc7fead6836b1a2ce0d12e3153e 100644 (file)
@@ -1073,6 +1073,20 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         }
         else {
           $display = CRM_Utils_Array::value($value, $field['options'], '');
+          // For float type (see Number and Money) $value would be decimal like
+          // 1.00 (because it is stored in db as decimal), while options array
+          // key would be integer like 1. In this case expression on line above
+          // would return empty string (default value), despite the fact that
+          // matching option exists in the array.
+          // In such cases we could just get intval($value) and fetch matching
+          // option again, but this would not work if key is float like 5.6.
+          // So we need to truncate trailing zeros to make it work as expected.
+          if ($display === '' && strpos($value, '.') !== FALSE) {
+            // Use round() to truncate trailing zeros, e.g:
+            // 10.00 -> 10, 10.60 -> 10.6, 10.69 -> 10.69.
+            $value = (string) round($value, 5);
+            $display = $field['options'][$value] ?? '';
+          }
         }
         break;