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
相关产品推荐
相关产品推荐

