Java中如何将整型数据转换为压缩十进制
我正在编写java代码,我需要在java中将int数据转换为压缩十进制。 因为压缩十进制是一种旧格式(COBOL)。我找到的解决方案处理int到压缩十进制,但不是浮点。 我有两个变量,长度和小数点后的数字必须存储为压缩小数 例如:Java中如何将整型数据转换为压缩十进制,java,data-conversion,dataformat,Java,Data Conversion,Dataformat,我正在编写java代码,我需要在java中将int数据转换为压缩十进制。 因为压缩十进制是一种旧格式(COBOL)。我找到的解决方案处理int到压缩十进制,但不是浮点。 我有两个变量,长度和小数点后的数字必须存储为压缩小数 例如:length=6(半字节) 这意味着总长度=3字节+1/5字节+1/5字节(以获得偶数字节) 小数点后存储的半字节数=2 (Unsigned) 12345.67 >> 1234567F 如果半字节数=4 (Unsigned) 12345.67 >&g
length=6(半字节)
这意味着总长度=3字节+1/5字节+1/5字节(以获得偶数字节)
小数点后存储的半字节数=2
(Unsigned) 12345.67 >> 1234567F
如果半字节数=4
(Unsigned) 12345.67 >> 3456700F
任何代码都将受到高度赞赏。这里是@GilbertLeBlanc提供的一个示例,它应该可以解决您的问题
public class PackedDecimal {
public static byte[] format(long number, int bytes) {
byte[] b = new byte[bytes];
final byte minusSign = 0x0D; // Minus
final byte noSign = 0x0F; // Unsigned
String s = Long.toString(number);
int length = s.length();
boolean isNegative = false;
if (s.charAt(0) == '-') {
isNegative = true;
s = s.substring(1);
length--;
}
int extraBytes = length - bytes + 1;
if (extraBytes < 0) {
// Pad extra byte positions with zero
for (int i = 0; i < -extraBytes; i++) {
b[i] = 0x00;
}
} else if (extraBytes > 0) {
// Truncate the high order digits of the number to fit
s = s.substring(extraBytes);
length -= extraBytes;
extraBytes = 0;
}
// Translate the string digits into bytes
for (int i = 0; i < length; i++) {
String digit = s.substring(i, i + 1);
b[i - extraBytes] = Byte.valueOf(digit);
}
// Add the sign byte
if (isNegative) {
b[bytes - 1] = minusSign;
} else {
b[bytes - 1] = noSign;
}
return b;
}
public static void main(String[] args) {
long number = -456L;
byte[] b = PackedDecimal.format(number, 5);
System.out.println("Number: " + number + ", packed: " + byteToString(b));
number = 0L;
b = PackedDecimal.format(number, 5);
System.out.println("Number: " + number + ", packed: " + byteToString(b));
number = 5823L;
b = PackedDecimal.format(number, 5);
System.out.println("Number: " + number + ", packed: " + byteToString(b));
number = 123456L;
b = PackedDecimal.format(number, 5);
System.out.println("Number: " + number + ", packed: " + byteToString(b));
}
public static String byteToString(byte[] b) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < b.length; i++) {
sb.append("0x");
sb.append(Integer.toHexString((int) b[i]).toUpperCase());
sb.append(" ");
}
return sb.toString();
}
}
不幸的是,我们不能简单地为您提供代码。请发布您想要的结果(您想要的输出示例)以及您所做的任何尝试。我刚刚发布了更多详细信息我发布的答案转换为压缩十进制。我不明白它怎么会不起作用。嗯,你发布的代码将长十进制转换为压缩十进制,不包括浮点和大十进制。然后代码有一个稳定的数字5,这不是压缩十进制的工作方式,它主要是根据小数点后的长度和位数左右移动值。
Number: -456, packed: 0x0 0x4 0x5 0x6 0xD
Number: 0, packed: 0x0 0x0 0x0 0x0 0xF
Number: 5823, packed: 0x5 0x8 0x2 0x3 0xF
Number: 123456, packed: 0x3 0x4 0x5 0x6 0xF