Wie kommst du zu diesem verwirrend kleinen Ergebnis? Bei mir ergeben 10 Ziffern (dezimal) 10 Milliarden Einträge.
Code: Alles auswählen.
REPORT.
CLASS lcl_base_converter DEFINITION.
PUBLIC SECTION.
CONSTANTS:
BEGIN OF system,
binary TYPE i VALUE 2,
octal TYPE i VALUE 8,
decimal TYPE i VALUE 10,
hex TYPE i VALUE 16,
base36 TYPE i VALUE 36,
base62 TYPE i VALUE 62,
END OF system.
CLASS-METHODS set_base
IMPORTING i_base TYPE i.
CLASS-METHODS base_to_decimal
IMPORTING i_number TYPE string
RETURNING VALUE(r_result) TYPE decfloat34.
CLASS-METHODS decimal_to_base
IMPORTING i_number TYPE decfloat34
RETURNING VALUE(r_result) TYPE string.
CLASS-METHODS get_next_number
IMPORTING i_number TYPE string
RETURNING VALUE(r_result) TYPE string.
PRIVATE SECTION.
CLASS-DATA base TYPE i VALUE 62.
CONSTANTS c_base_chars TYPE string VALUE '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
ENDCLASS.
CLASS lcl_base_converter IMPLEMENTATION.
METHOD decimal_to_base.
IF i_number = 0.
RETURN c_base_chars(1).
ENDIF.
DATA(number) = i_number.
WHILE number > 0.
DATA(remainder) = number MOD base.
r_result = c_base_chars+remainder(1) && r_result.
number = number DIV base.
ENDWHILE.
ENDMETHOD.
METHOD base_to_decimal.
DATA l_factor TYPE decfloat34 VALUE 1.
IF NOT ( i_number CA c_base_chars ).
RETURN.
ENDIF.
DATA(len) = strlen( i_number ).
DO len TIMES.
len -= 1.
DATA(char) = i_number+len(1).
FIND char IN c_base_chars MATCH OFFSET DATA(off).
r_result += ( off * l_factor ).
l_factor *= base.
ENDDO.
ENDMETHOD.
METHOD get_next_number.
DATA overflow TYPE i.
DATA(len) = strlen( i_number ).
DO len TIMES.
DATA(idx) = len - sy-index.
DATA(char) = i_number+idx(1).
FIND char IN c_base_chars MATCH OFFSET DATA(off).
IF off < base - 1.
off += 1.
r_result = i_number+0(idx) && c_base_chars+off(1) && r_result.
EXIT.
ENDIF.
overflow += 1.
ENDDO.
IF overflow = len.
r_result = c_base_chars+1(1).
ENDIF.
DO overflow TIMES.
r_result = |{ r_result }{ c_base_chars(1) }|.
ENDDO.
ENDMETHOD.
METHOD set_base.
base = i_base.
ENDMETHOD.
ENDCLASS.
CLASS ltc_converter_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
PRIVATE SECTION.
METHODS to_62_1 FOR TESTING.
METHODS to_62_2 FOR TESTING.
METHODS to_hex FOR TESTING.
METHODS to_binary FOR TESTING.
METHODS to_decimal FOR TESTING.
METHODS to_dec_1 FOR TESTING.
METHODS to_dec_2 FOR TESTING.
METHODS to_dec_3 FOR TESTING.
METHODS next_1 FOR TESTING.
METHODS next_2 FOR TESTING.
METHODS next_3 FOR TESTING.
ENDCLASS.
CLASS ltc_converter_test IMPLEMENTATION.
METHOD next_1.
lcl_base_converter=>set_base( lcl_base_converter=>system-binary ).
cl_abap_unit_assert=>assert_equals( exp = '1'
act = lcl_base_converter=>get_next_number( '0' ) ).
cl_abap_unit_assert=>assert_equals( exp = '11'
act = lcl_base_converter=>get_next_number( '10' ) ).
cl_abap_unit_assert=>assert_equals( exp = '100'
act = lcl_base_converter=>get_next_number( '11' ) ).
ENDMETHOD.
METHOD next_2.
lcl_base_converter=>set_base( lcl_base_converter=>system-hex ).
cl_abap_unit_assert=>assert_equals( exp = '10'
act = lcl_base_converter=>get_next_number( 'F' ) ).
cl_abap_unit_assert=>assert_equals( exp = '100'
act = lcl_base_converter=>get_next_number( 'FF' ) ).
cl_abap_unit_assert=>assert_equals( exp = '1'
act = lcl_base_converter=>get_next_number( '0' ) ).
ENDMETHOD.
METHOD next_3.
lcl_base_converter=>set_base( lcl_base_converter=>system-base62 ).
cl_abap_unit_assert=>assert_equals( exp = '10'
act = lcl_base_converter=>get_next_number( 'z' ) ).
cl_abap_unit_assert=>assert_equals( exp = '100'
act = lcl_base_converter=>get_next_number( 'zz' ) ).
cl_abap_unit_assert=>assert_equals( exp = '1'
act = lcl_base_converter=>get_next_number( '0' ) ).
ENDMETHOD.
METHOD to_62_1.
lcl_base_converter=>set_base( lcl_base_converter=>system-base62 ).
cl_abap_unit_assert=>assert_equals( exp = '0'
act = lcl_base_converter=>decimal_to_base( 0 ) ).
cl_abap_unit_assert=>assert_equals( exp = '9'
act = lcl_base_converter=>decimal_to_base( 9 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'A'
act = lcl_base_converter=>decimal_to_base( 10 ) ).
ENDMETHOD.
METHOD to_62_2.
lcl_base_converter=>set_base( lcl_base_converter=>system-base62 ).
cl_abap_unit_assert=>assert_equals( exp = 'z'
act = lcl_base_converter=>decimal_to_base( 61 ) ).
cl_abap_unit_assert=>assert_equals( exp = '10'
act = lcl_base_converter=>decimal_to_base( 62 ) ).
cl_abap_unit_assert=>assert_equals( exp = 'KyXecRaPqzvjQ8BcV'
act = lcl_base_converter=>decimal_to_base( 999999999999999999999999999999 ) ).
ENDMETHOD.
METHOD to_hex.
lcl_base_converter=>set_base( lcl_base_converter=>system-hex ).
cl_abap_unit_assert=>assert_equals( exp = '11'
act = lcl_base_converter=>decimal_to_base( 17 ) ).
cl_abap_unit_assert=>assert_equals( exp = '611'
act = lcl_base_converter=>decimal_to_base( 1553 ) ).
ENDMETHOD.
METHOD to_binary.
lcl_base_converter=>set_base( lcl_base_converter=>system-binary ).
cl_abap_unit_assert=>assert_equals( exp = '11'
act = lcl_base_converter=>decimal_to_base( 3 ) ).
cl_abap_unit_assert=>assert_equals( exp = '10000000000'
act = lcl_base_converter=>decimal_to_base( 1024 ) ).
ENDMETHOD.
METHOD to_decimal.
lcl_base_converter=>set_base( lcl_base_converter=>system-decimal ).
cl_abap_unit_assert=>assert_equals( exp = '10'
act = lcl_base_converter=>decimal_to_base( 10 ) ).
cl_abap_unit_assert=>assert_equals( exp = '99'
act = lcl_base_converter=>decimal_to_base( 99 ) ).
ENDMETHOD.
METHOD to_dec_1.
lcl_base_converter=>set_base( lcl_base_converter=>system-hex ).
cl_abap_unit_assert=>assert_equals( exp = '17'
act = lcl_base_converter=>base_to_decimal( '11' ) ).
cl_abap_unit_assert=>assert_equals( exp = '1553'
act = lcl_base_converter=>base_to_decimal( '611' ) ).
ENDMETHOD.
METHOD to_dec_2.
lcl_base_converter=>set_base( lcl_base_converter=>system-binary ).
cl_abap_unit_assert=>assert_equals( exp = '3'
act = lcl_base_converter=>base_to_decimal( '11' ) ).
cl_abap_unit_assert=>assert_equals( exp = '1024'
act = lcl_base_converter=>base_to_decimal( '10000000000' ) ).
ENDMETHOD.
METHOD to_dec_3.
lcl_base_converter=>set_base( lcl_base_converter=>system-base62 ).
cl_abap_unit_assert=>assert_equals( exp = '0'
act = lcl_base_converter=>base_to_decimal( '0' ) ).
cl_abap_unit_assert=>assert_equals( exp = '61'
act = lcl_base_converter=>base_to_decimal( 'z' ) ).
cl_abap_unit_assert=>assert_equals( exp = '62'
act = lcl_base_converter=>base_to_decimal( '10' ) ).
cl_abap_unit_assert=>assert_equals( exp = '999999999999999999999999999999'
act = lcl_base_converter=>base_to_decimal( 'KyXecRaPqzvjQ8BcV' ) ).
ENDMETHOD.
ENDCLASS.
Folgende Benutzer bedankten sich beim Autor rob_abc für den Beitrag:
a-dead-trousers