Java中如何将整型数据转换为压缩十进制

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

我正在编写java代码,我需要在java中将int数据转换为压缩十进制。 因为压缩十进制是一种旧格式(COBOL)。我找到的解决方案处理int到压缩十进制,但不是浮点。 我有两个变量,长度和小数点后的数字必须存储为压缩小数

例如:
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