From 49fcc05794d90cf5f6bf2fe19656b7c4985fd1a5 Mon Sep 17 00:00:00 2001 From: Markus Date: Thu, 1 Aug 2024 16:56:31 +0200 Subject: [PATCH] Generalize `get_max_value` method for packed numbers (#893) --- src/abap/cl_abap_exceptional_values.clas.abap | 32 ++++++++++++------- ...p_exceptional_values.clas.testclasses.abap | 13 ++++++++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/abap/cl_abap_exceptional_values.clas.abap b/src/abap/cl_abap_exceptional_values.clas.abap index 2af53e20..5609eac5 100644 --- a/src/abap/cl_abap_exceptional_values.clas.abap +++ b/src/abap/cl_abap_exceptional_values.clas.abap @@ -16,10 +16,13 @@ ENDCLASS. CLASS cl_abap_exceptional_values IMPLEMENTATION. METHOD get_max_value. - DATA lv_type TYPE c LENGTH 1. - DATA lv_length TYPE i. - DATA lv_decimals TYPE i. - FIELD-SYMBOLS TYPE any. + DATA lv_type TYPE c LENGTH 1. + DATA lv_length TYPE i. + DATA lv_decimals TYPE i. + DATA lv_digits_before_decimal TYPE i. + DATA lv_integer_part TYPE string. + DATA lv_decimal_part TYPE string. + FIELD-SYMBOLS TYPE any. DESCRIBE FIELD in TYPE lv_type. @@ -32,15 +35,20 @@ CLASS cl_abap_exceptional_values IMPLEMENTATION. CREATE DATA out TYPE p LENGTH lv_length DECIMALS lv_decimals. ASSIGN out->* TO . - IF lv_length = 3 AND lv_decimals = 1. - = '9999.9'. - ELSEIF lv_length = 4 AND lv_decimals = 1. - = '999999.9'. - ELSEIF lv_length = 7 AND lv_decimals = 3. - = '9999999999.999'. - ELSE. - ASSERT 1 = 'todo'. + lv_digits_before_decimal = lv_length * 2 - 1 - lv_decimals. + + DO lv_digits_before_decimal TIMES. + lv_integer_part = lv_integer_part && '9'. + ENDDO. + + IF lv_decimals > 0. + lv_decimal_part = '.'. + DO lv_decimals TIMES. + lv_decimal_part = lv_decimal_part && '9'. + ENDDO. ENDIF. + + = lv_integer_part && lv_decimal_part. WHEN OTHERS. WRITE '@KERNEL console.dir(INPUT);'. ASSERT 1 = 'todo'. diff --git a/src/abap/cl_abap_exceptional_values.clas.testclasses.abap b/src/abap/cl_abap_exceptional_values.clas.testclasses.abap index f5be7c85..788eceef 100644 --- a/src/abap/cl_abap_exceptional_values.clas.testclasses.abap +++ b/src/abap/cl_abap_exceptional_values.clas.testclasses.abap @@ -7,6 +7,7 @@ CLASS ltcl_exceptional_values DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATIO METHODS max_packed1 FOR TESTING RAISING cx_static_check. METHODS max_packed2 FOR TESTING RAISING cx_static_check. METHODS max_packed3 FOR TESTING RAISING cx_static_check. + METHODS max_packed4 FOR TESTING RAISING cx_static_check. METHODS min_packed FOR TESTING RAISING cx_static_check. ENDCLASS. @@ -49,6 +50,18 @@ CLASS ltcl_exceptional_values IMPLEMENTATION. exp = '999999.9' ). ENDMETHOD. + METHOD max_packed4. + DATA foo TYPE p LENGTH 9 DECIMALS 5. + DATA ref TYPE REF TO data. + FIELD-SYMBOLS TYPE any. + ref = cl_abap_exceptional_values=>get_max_value( foo ). + ASSIGN ref->* TO . + + cl_abap_unit_assert=>assert_equals( + act = + exp = '999999999999.99999' ). + ENDMETHOD. + METHOD min_packed. DATA max TYPE p LENGTH 3 DECIMALS 1. DATA ref TYPE REF TO data.