有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

例如:length = 6(in half a byte)

这意味着total length=3 bytes+1/5 byte+1/5 byte(To get even number of bytes) 小数点后存储的半字节数=2

(Unsigned) 12345.67 >> 1234567F

如果半字节数=4

(Unsigned) 12345.67 >> 3456700F

任何代码都将受到高度赞赏


共 (1) 个答案

  1. # 1 楼答案

    下面是@GilbertLeBlanc提供的一个示例from this post,它应该是您问题的解决方案

    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();
        }
    
    }
    

    主要方法的试验结果如下:

    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