The data my come you from any other system in the form of CSV file, XML file other flat files. RPG will translate positive (+) or negative (-) signs either at the beginning or end of the numeric data. A decimal point can be specified and blanks are allowed. However, it won't accept currency symbols, thousands separators, and asterisks. If you know that other characters are there in the data then you must preprocess that before you use any of the built-in functions using the %XLATE function.
For example, if Amount has a value of '$85,325.67-**' you could use %XLATE first to convert the currency symbol, asterisks, and commas to blanks. The %DEC function doesn't mind the embedded blanks, so your program would get a seven digit packed return value of -85325.67.
Usage: %DEC(%XLATE('$*,':' ':Amount) :15 : 2 )
D Stringdata s 50 D Number s 15p 2 Monitor; Number = %Dec( %Xlate('$,*' : ' ' : Stringdata) : 15 : 2); On-Error 105; // Error handling logic goes here EndMon;
You can also also using C progamming to convert string data to numeric. You have include the C binding directory QC2LE.
H Option(*SrcStmt : *NoDebugIO) bnddir('QC2LE') datof pr 8f extproc('atof') d string * options(*string) d value /free Number = %dech(atof(%trim(string)):15:2); /end-free
%dech will half-adjust the result.If you don't, the extracted number may not match the string. Also invalid data returns a zero so you have make sure the input data is all good.
The old fashined way to convert character to numeric data using RPGLE. I wrote this program long time back, works like a charm all the time.