Tuesday, February 2, 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.


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. 

If you have any Suggestions or Feedback, Please leave a comment below or use Contact Form. 


  1. What if NUMBER is zoned(9: 2)?
    I'm passing a value to my rpg as char and I want to use it to chain to a file, where the key is zoned. Can I use %dec to convert the char to a zoned numeric?
    Can I use a packed numeric field when chaining to the file if the key is zoned?

    1. Hi Glenn,

      You can convert to zoned decimal using %DEC and use it to chain to a file. Here is a quick sample from me.

      Dcl-F TestFile Keyed ; // Zoned Decimal is the Key

      Dcl-PR TestRpgle ExtPgm('TESTRPGLE') ;
      ZonedAsChar Char(10) ;
      End-PR ;

      Dcl-S ZonedDec Zoned(9:2) ;

      Dcl-PI TestRpgle ;
      ZonedAsChar Char(10) ;
      End-PI ;

      ZonedDec = %Dec(ZonedAsChar:9:2) ;

      Chain ZonedDec TestFile ;
      If %Found(TestFile) ;
      Dsply Character ; // Another field in the file
      EndIf ;

      *InLr = *On ;



Different Ways of Sorting Data in a List - Python

Sorting Data in a List List is a collection of data (of different data types), much like an array. Like any data structure or data set, dat...