【问题标题】:How to convert int data to packed decimal in Java如何在 Java 中将 int 数据转换为压缩十进制
【发布时间】:2019-06-07 15:09:00
【问题描述】:

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

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

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

【问题讨论】:

  • 很遗憾,我们不能简单地为您提供代码。请发布您想要的结果(您想要的输出示例)以及您所做的任何尝试。
  • 我刚刚发布了更多详细信息
  • 我发布的答案转换为压缩十进制。我不明白它是如何不起作用的。
  • 好吧,您发布的代码将 long 转换为压缩十进制,不包括 float 和 big decimal。然后代码有一个稳定的数字5,这不是压缩十进制的工作方式,它主要是根据小数点后的长度和位数左右移动值。

标签: java data-conversion dataformat


【解决方案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();
    }

}

main方法中的测试结果如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多