You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 22:如何读取CSV中带0x前缀的十六进制值并保留格式输出?

解决方案:保留CSV数值的原始格式输出

问题本质是:当你用Integer.decode把字符串转成数值后,原始的格式信息(十六进制/十进制)会丢失,所以需要在读取时额外记录每个值的格式类型,输出时根据类型还原格式。

实现代码

import java.util.Scanner;

// 用record存储数值和原始格式类型(Java 16+支持,Java 22完全兼容)
record NumberWithFormat(int value, boolean isHex) {}

public class Main {
    public static void main(String[] args) {
        // 模拟CSV输入,可替换为文件读取逻辑
        Scanner s = new Scanner("0x00000000, 0, 0x03000000, 1, 0x05000000, 2");
        s.useDelimiter(", ");

        while (s.hasNext()) {
            String token = s.next();
            NumberWithFormat numInfo;

            if (token.startsWith("0x")) {
                // 处理十六进制值
                int value = Integer.decode(token);
                numInfo = new NumberWithFormat(value, true);
            } else {
                // 处理十进制值
                int value = Integer.parseInt(token);
                numInfo = new NumberWithFormat(value, false);
            }

            // 根据格式类型输出
            if (numInfo.isHex()) {
                // 格式化8位小写十六进制,带0x前缀
                System.out.printf("0x%08x (Hex int)%n", numInfo.value());
            } else {
                System.out.printf("%d (Dec int)%n", numInfo.value());
            }
        }
        s.close();
    }
}

代码说明

  • 记录格式类型:用NumberWithFormat这个record同时保存数值和是否为十六进制的标记,彻底避免格式信息丢失
  • 十六进制格式化:用String.format("0x%08x", ...)保证输出固定8位的十六进制字符串,和原始输入的格式完全匹配(比如输出0x00000000而非简化的0x0)
  • 输入兼容:自动识别带0x前缀的十六进制和普通十进制字符串,完美适配你的CSV格式

输出结果

0x00000000 (Hex int)
0 (Dec int)
0x03000000 (Hex int)
1 (Dec int)
0x05000000 (Hex int)
2 (Dec int)

扩展说明

如果需要处理超出int范围的数值,可将类型替换为long,对应使用Long.decode和Long.parseInt;如果要保留原始输入的大小写(比如输入是0X前缀),可以调整判断逻辑和格式化参数(用%08X输出大写十六进制)。

内容的提问来源于stack exchange,提问作者Spenser Spratlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:20:32