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.
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.
We can use the same example by just adding EXPROPTS to control options would execute the program successfully.
EXPROPTS(*ALWBLANKNUM : *USEDECEDIT)
What if NUMBER is zoned(9: 2)?
ReplyDeleteI'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?
Hi Glenn,
DeleteYou can convert to zoned decimal using %DEC and use it to chain to a file. Here is a quick sample from me.
**Free
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 ;
Thanks.