@@ -31,12 +31,13 @@ object DisplayEncoders {
3131 val isSigned = signPosition.isDefined
3232 val lengthAdjustment = if (isSigned) 1 else 0
3333 val isSignPositionRight = signPosition.contains(za.co.absa.cobrix.cobol.parser.position.Right )
34- val isNegative = number.signum() < 0
3534 val bytes = new Array [Byte ](outputSize)
3635
3736 if (number == null || precision < 1 || scale < 0 || outputSize < 1 || (scaleFactor > 0 && scale > 0 ))
3837 return bytes
3938
39+ val isNegative = number.signum() < 0
40+
4041 val num = if (explicitDecimalPoint) {
4142 val shift = scaleFactor
4243
@@ -45,7 +46,7 @@ object DisplayEncoders {
4546 else
4647 number.abs().movePointLeft(shift).setScale(scale, RoundingMode .HALF_EVEN )
4748
48- val bigDecimalValue1 = bigDecimal.toString
49+ val bigDecimalValue1 = bigDecimal.toPlainString
4950
5051 val bigDecimalValue = if (bigDecimalValue1.startsWith(" 0." ))
5152 bigDecimalValue1.drop(1 )
@@ -86,13 +87,13 @@ object DisplayEncoders {
8687 scaleFactor : Int ,
8788 explicitDecimalPoint : Boolean ): Array [Byte ] = {
8889 val isSigned = signPosition.isDefined
89- val isNegative = number.signum() < 0
9090 val bytes = new Array [Byte ](outputSize)
9191
92-
9392 if (number == null || precision < 1 || scale < 0 || outputSize < 1 || (scaleFactor > 0 && scale > 0 ))
9493 return bytes
9594
95+ val isNegative = number.signum() < 0
96+
9697 val num = if (explicitDecimalPoint) {
9798 val shift = scaleFactor
9899
@@ -101,7 +102,7 @@ object DisplayEncoders {
101102 else
102103 number.abs().movePointLeft(shift).setScale(scale, RoundingMode .HALF_EVEN )
103104
104- val bigDecimalValue1 = bigDecimal.toString
105+ val bigDecimalValue1 = bigDecimal.toPlainString
105106
106107 val bigDecimalValue = if (bigDecimalValue1.startsWith(" 0." ))
107108 bigDecimalValue1.drop(1 )
@@ -143,7 +144,7 @@ object DisplayEncoders {
143144
144145 var i = 0
145146 while (i < arLen) {
146- var ebcdic = 0x40 .toByte
147+ var ebcdic = 0xF0 .toByte
147148
148149 if (i == 0 ) {
149150 // Signal overpunching
@@ -164,7 +165,7 @@ object DisplayEncoders {
164165 val c = num(numLen - i - 1 )
165166 if (c >= '0' && c <= '9' ) {
166167 ebcdic = ((c - '0' ) + 0xF0 ).toByte
167- } else if (c == '.' || c == ',' ) {
168+ } else if (c == '.' ) {
168169 ebcdic = 0x4B
169170 }
170171 }
@@ -174,43 +175,38 @@ object DisplayEncoders {
174175 }
175176 }
176177
177- def setPaddedEbcdicNumberWithSignSeparate (absNum : String , isSigned : Boolean , isNegative : Boolean , isSignPositionRight : Boolean , array : Array [Byte ]): Unit = {
178- val num = if (isSigned) {
179- if (isNegative) {
180- if (isSignPositionRight) {
181- s " $absNum- "
182- } else {
183- s " - $absNum"
184- }
185- } else {
186- absNum
187- }
188- } else {
189- absNum
190- }
178+ def setPaddedEbcdicNumberWithSignSeparate (num : String , isSigned : Boolean , isNegative : Boolean , isSignPositionRight : Boolean , array : Array [Byte ]): Unit = {
191179 val numLen = num.length
192180 val arLen = array.length
181+ val fullNumLength = if (isSigned) numLen + 1 else numLen
193182
194- if (numLen > arLen)
183+ if (fullNumLength > arLen)
195184 return
196185
186+ val shift = if (isSigned && isSignPositionRight) 1 else 0
197187 var i = 0
198- while (i < arLen) {
199- var ebcdic = 0x40 .toByte
188+ while (i < arLen - shift ) {
189+ var ebcdic = 0xF0 .toByte
200190
201191 if (i < numLen) {
202192 val c = num(numLen - i - 1 )
203193 if (c >= '0' && c <= '9' ) {
204194 ebcdic = ((c - '0' ) + 0xF0 ).toByte
205- } else if (c == '.' || c == ',' ) {
195+ } else if (c == '.' ) {
206196 ebcdic = 0x4B
207- } else if (c == '-' ) {
208- ebcdic = 0x60
209197 }
210198 }
211199
212- array(arLen - i - 1 ) = ebcdic
200+ array(arLen - i - shift - 1 ) = ebcdic
213201 i += 1
214202 }
203+
204+ if (isSigned) {
205+ if (isNegative) {
206+ if (isSignPositionRight) array(arLen - 1 ) = 0x60 else array(0 ) = 0x60
207+ } else {
208+ if (isSignPositionRight) array(arLen - 1 ) = 0x4E else array(0 ) = 0x4E
209+ }
210+ }
215211 }
216212}
0 commit comments