search results

Devel(UP) Your Skills

Wednesday, March 31, 2021

Character to Numeric conversion in RPG - Allow Blanks & Thousands Separator - IBM i

 

Character to Numeric Conversion

Converting a numeric value from a character field to decimal field is one thing that we use almost every other day. 

There are many BIFs to do this (like %DEC, %INT, %FLOAT...). 

What if the character field doesn't contain any data? Or, If the character field contains comma (,) as thousands separator? 

Before we see how we deal with these, let's see what happens if a blank character field is used to convert a numeric value or if character field contains thousands separator. 

Character to Numeric conversion in RPGLE - IBM i

In the above example, We are doing character to numeric conversion twice with a blank value and a number stored in character with thousands separator. We are enclosing both these operations in a Monitor block, so that program doesn't fail.
  • Line - 9: Converting blank character to a decimal value. %DEC doesn't allow blank value by default (with no control options specified) and this statement would fail causing the program to run On-Error block. 
  • Line - 19: Converting character (number with thousands separator and two decimal positions) to a decimal value. %DEC would only allow one separator ('.' or ',') and considers them as a separator for decimal positions. In this case, multiple separators are used and would cause the statement to fail and program would execute On-Error block. 
Both the scenarios mentioned above would result in failure. It is not always possible to setup On-Error block with the appropriate default value to be specified as we will be working with wide range of data (as the On-Error block mostly used to deal with invalid values and the above two scenarios are valid). 

We can use 'EXPROPTS' (Expression Options) to deal with these two scenarios. 
  • Using '*ALWBLANKNUM' in control options with EXPROPTS would convert the Blank character to zero with out any error. 
  • Using '*USEDECEDIT' in control options with EXPROPTS would consider the thousands separators and decimal separator as specified in control specifications using DECEDIT.
If we don't specify DECEDIT in the control specification, By default ',' (comma) would be considered as separator and '.' (period) would be considered to identify decimal positions. 

We can use the same example by just adding EXPROPTS to control options would execute the program successfully.

EXPROPTS(*ALWBLANKNUM : *USEDECEDIT)


Character to Numeric conversion in RPGLE - IBM i

This makes the error handling easy while doing Character to Numeric conversions. 

Hope the above info was a bit of help. 

No comments:

Country calling code