Java中带零的左填充整数(非十进制格式)

Java中带零的左填充整数(非十进制格式),java,Java,问题是这样的,但我正在寻找一种优雅的方法来处理非十进制格式的整数(如二进制、八进制、十六进制) 创建此类字符串很容易: String intAsString = Integer.toString(12345, 8); 将创建一个八进制表示为整数值12345的字符串。但是,除了计算所需的零的数量和“手工”组装一个新字符串外,如何格式化它,使字符串有10个数字 一个典型的使用案例是创建具有固定位数(如16、32等)的二进制数,其中希望所有数字都包含前导零。您只需编写: String intAsSt

问题是这样的,但我正在寻找一种优雅的方法来处理非十进制格式的整数(如二进制、八进制、十六进制)

创建此类字符串很容易:

String intAsString = Integer.toString(12345, 8);
将创建一个八进制表示为整数值12345的字符串。但是,除了计算所需的零的数量和“手工”组装一个新字符串外,如何格式化它,使字符串有10个数字

一个典型的使用案例是创建具有固定位数(如16、32等)的二进制数,其中希望所有数字都包含前导零。

您只需编写:

String intAsString = Strings.padStart(Integer.toString(12345, 8), 10, '0');

对于oct和hex,它非常简单:

这个怎么样(标准Java):

private final静态字符串zeros=“0000000000”;
// ...
字符串s=Integer.toString(12345,8);

String intAsString=s.length()在的帮助下,这里有一个更可重用的替代方法


ColinD发布的番石榴示例非常流畅。

例如,使用零填充打印十六进制数字:

System.out.println(String.format("%08x", 1234));
将给出以下输出,包括填充:

000004d2

用八进制的相关格式字符替换x可能也会有同样的效果。

您所说的“优雅”解决方案是一个库函数。我认为没有比计算所需的零并预先连接它们更优雅的解决方案了。无论如何,如果有一个数学技巧/算法来做你想做的事情,那么二进制、八进制和十六进制就不同了…@pakore-是的,你是对的,Java API中已经存在的一些“库”函数对我来说是“最优雅的”;)我只是讨厌一次又一次地重新实现这种填充代码。好吧,看看NumberFormat类,创建一个八进制、HexFormat和BinaryFormat类,使用填充零的方法,创建一个功能提案,提交代码,等几个月,升级库,然后将其作为库函数:)。或者,您可以为您的项目创建自己的库帮助器:不要一次又一次地重新实现它。使用提供它的现有库,即使它不是标准Java库。这基本上是一个字符串填充问题,而不是一个数字问题。@ColinD-Guava是我现在最喜欢的答案,如果我没有一个很好的答案/模式来用标准Java API解决它,那么你就会得到“接受”;)是的..但是..我在寻找一种通用的方法,使用任何给定的基数(有一个实用的上限,因为我们需要字母来表示数字,就像十六进制值一样),非常感谢!这是一个很容易记住的模式!电子战。这并没有清楚地说明它在做什么,而且它一点也不灵活。如果您想避免使用库,只需编写您自己的字符串填充方法并完成它。我当然不想记住这样的“模式”,我绝对不想看到它在代码中被多个地方使用。@ColinD-我部分同意。如果我在应用程序上下文中需要填充,那么我可能会包括番石榴。但是对于所有这些小片段和试验,Jespers的解决方案是我一直在寻找的。我没有在我的答案中显示它,但我将它放在一个方法中,可能在
StringUtils
类中(这样
zero
也有生存的空间),而不是在代码中的多个位置重复它。你不应该连接字符串
public static String padZero(int number, int radix, int length) {
    String string = Integer.toString(number, radix);
    StringBuilder builder = new StringBuilder().append(String.format("%0" + length + "d", 0));
    return builder.replace(length - string.length(), length, string).toString();
}
System.out.println(String.format("%08x", 1234));
000004d2