Skip to content

Commit 41566c4

Browse files
committed
#782 spark-cobol writer: DISPLAY numbers with sign separate always puts the sign, '+' and '-'.
1 parent a328804 commit 41566c4

File tree

3 files changed

+118
-86
lines changed

3 files changed

+118
-86
lines changed

cobol-parser/src/main/scala/za/co/absa/cobrix/cobol/parser/encoding/DisplayEncoders.scala

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)