Abd*_*had 0 java parsing cobol
我正在从服务器发送和接收产品信息作为字符串,服务器以COBOLS s9(6)v99格式接收和发送产品的价格.我无法在java中将给定的小数转换为此格式.
COBOL s9(6)V99格式exmaples:
注意:目前我没有实现转换,我正在寻找解决方案
一般来说
s9(6)V99 sign leading那么在java中处理它会容易得多.在您的情况下,这可能不是一个选项如果您可以获得Cobol Copybook,为什么不使用Cobol/Java软件包之一
注意:即使您没有Full Cobol Copybook,也可以为此一个字段设置Cobol Copybook,并仍使用包.本字帖将是:
01 MY-REC.
03 FIELD-1 PIC S9(6)V99.
Run Code Online (Sandbox Code Playgroud)
没有一个单独的Cobol Zoned Decimal格式,它从compilere到Compiler以及编码是什么.解码Zoned Decimal你真的需要知道
在这种情况下,我猜它是
在分区十进制中:
overpunched位于最后一位数字上.assumed小数位因此s9(6)V99是一个带符号的数字,小数位前面有6位数字,后面是2位数字
encoding服务器使用的(字符集)确定符号数字的表示方式.对于美国(和英国),Ebcdic + 0/-0是{ / }德国Ebcdic的不同之处.对于ASCII服务器,它又是不同的
ebcdic转换代码(注意它仍然需要针对假定的十进制进行调整):
private static int positiveDiff = 'A' - '1';
private static int negativeDiff = 'J' - '1';
private static char positive0EbcdicZoned = '{';
private static char negative0EbcdicZoned = '}';
public static String fromZoned(String numZoned) {
String ret;
String sign = "";
char lastChar, ucLastChar;
if (numZoned == null || ((ret = numZoned.trim()).length() == 0) || ret.equals("-")) {
return "";
}
lastChar = ret.charAt(ret.length() - 1);
ucLastChar = Character.toUpperCase(lastChar);
switch (ucLastChar) {
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'H':
case 'I':
lastChar = (char) (ucLastChar - positiveDiff);
break;
case 'J':
case 'K':
case 'L':
case 'M':
case 'N':
case 'O':
case 'P':
case 'Q':
case 'R':
sign = "-";
lastChar = (char) (ucLastChar - negativeDiff);
break;
default:
if (lastChar == positive0EbcdicZoned) {
lastChar = '0';
} else if (lastChar == negative0EbcdicZoned) {
lastChar = '0';
sign = "-";
}
}
ret = sign + ret.substring(0, ret.length() - 1) + lastChar;
return ret;
}
Run Code Online (Sandbox Code Playgroud)
设置+0/-0字符
public static void setDefaultEbcidicCharacterset(String charset) {
if (getHold(charset).isEbcdic) {
byte[] b = {(byte) 0xC0, (byte) 0xD0};
String s = new String(b, charset);
if (s.length() == 2) {
positive0EbcdicZoned = s.charAt(0);
negative0EbcdicZoned = s.charAt(1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
导出符号(用于EBCDIC编码)的另一种方法是将符号转换回原始字节:
private static final byte HIGH_NYBLE = (byte) 0xf0;
private static final byte ZONED_NEGATIVE_NYBLE_VALUE = (byte) 0xD0;
String Sign = "";
byte signByte = signStr.getBytes(encoding)[0];
if (((byte) (signByte & HIGH_NYBLE)) == ZONED_NEGATIVE_NYBLE_VALUE) {
sign = "-";
}
byte lastDigitBytes = (byte) (signByte | HIGH_NYBLE);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它是EBCDIC.对于基于ASCII的cobols,它又是不同的.这是Ascii Zoned -Decimal的JRecord泛型转换类:
注意:我是作者JRecord
| 归档时间: |
|
| 查看次数: |
1886 次 |
| 最近记录: |