本问题已经有最佳答案,请猛点这里访问。
有没有更好的方法来获得此结果? 如果num的位数比位数多,则此函数将失败,并且我认为它应该在库中的某个位置(例如Integer.toString(x,"%3d")等)
static String intToString(int num, int digits) {
StringBuffer s = new StringBuffer(digits);
int zeroes = digits - (int) (Math.log(num) / Math.log(10)) - 1;
for (int i = 0; i < zeroes; i++) {
s.append(0);
}
return s.append(num).toString();
}
您应该将接受的答案更改为@begray one。 对于绝大多数应用程序,他的性能要好得多,对于可变的零值,您可以使用String.format("%0" + digits +"d", num);
当然。 当时,我接受Elijahs是因为我的项目被锁定在Java 1.4中,但是我认为这不值得将10万其他用户误认为是对我有用的东西。
香港专业教育学院投票关闭作为重复。 虽然首先问了这个问题,但我认为重复的阅读起来较为清晰,似乎是一个规范的问题(基于投票数和观看次数)。
@Duncan,为什么将一个6岁的问题标记为重复?
@AngelKoh我在评论中解释了原因。
String.format(http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax)
在您的情况下,它将是:
String formatted = String.format("%03d", num);
0-填充零
3-将宽度设置为3
如果位数是可变的(例如,作为参数提供),则上述方法虽然优雅,但可能不适合。
Santhosh ...只需动态创建格式字符串String.format("%0" + paddingSize +"d", num)
我想@Fran除了GWT的那些
想要指出的是,此解决方案可能有问题:它会根据默认语言环境产生不同的结果,因为String.format是LOCALE-SPECIFIC。有许多不使用阿拉伯数字0-9的语言环境(奇怪的是,阿拉伯语是这些语言环境之一)。我有一个错误,当我用阿拉伯语设置手机时,我的代码在Android上崩溃了,因为我使用String.format("%04d-%02d-%02d",年,月,日)格式化日期字符串,认为会产生ISO 8601日期,但会产生类似" ????-??-??"的信息电话是阿拉伯语时。
@adevine您可以通过指定您想要的本地人来避免此错误:Local.US,对于阿拉伯用户来说,使用阿拉伯数字非常方便,只需调用String.format(Local.US, string, params)
String formatted = String.format((Locale) null,"%05d", yourLongNumber);应该也可以工作,并且对于某些语言来说更安全...
哇,那个老乡真的帮助了...
从Java 1.5开始,您可以使用String.format方法。例如,要执行与示例相同的操作:
String format = String.format("%%0%dd", digits);
String result = String.format(format, num);
return result;
在这种情况下,您要使用以数字指定的宽度创建格式字符串,然后将其直接应用于数字。此示例的格式转换如下:
%% --> %
0 --> 0
%d -->
d --> d
因此,如果digits等于5,则格式字符串将变为%05d,它指定宽度为5且打印前导零的整数。有关转换说明符的更多信息,请参见Java文档中的String.format。
请参阅begrays答案,该答案使用正确的标志将3个字符宽的输出置零。
@Robert确实设置了正确的宽度。它与bergays的答案完全相同,只是使用同一接口以编程方式添加了填充。您是否只是看了一眼格式字符串并确定它不正确,而没有查看代码实际在做什么?
似乎不需要两次使用String.format(),只需使用字符串串联:String.format("%0" + digits +"d", num)
如果是Java 1.4及更低版本,请尝试使用新的DecimalFormat(" 00000")。format(123);。如此处所示javadevnotes.com/java-integer-to-string-with-leading-zeros
另一个选择是使用DecimalFormat格式化数字字符串。如果您被困在1.5之前的版本中,这是无需使用String.format即可完成此工作的另一种方法:
static String intToString(int num, int digits) {
assert digits > 0 :"Invalid number of digits";
// create variable length array of zeros
char[] zeros = new char[digits];
Arrays.fill(zeros, '0');
// format number as String
DecimalFormat df = new DecimalFormat(String.valueOf(zeros));
return df.format(num);
}
当num = 0时不起作用,缺少一个零
怎么样:
public static String intToString(int num, int digits) {
String output = Integer.toString(num);
while (output.length() < digits) output ="0" + output;
return output;
}
(1)那将返回0num0num0num等,而不是00000num(2)很多带有" +"的字符串连接在性能上是一个坏主意。最好预先分配一个长度为数字的StringBuffer或StringBuilder
"(1)那将返回0num0num0num等,而不是00000num"-此注释是错误的... num不在循环内。
@Nappy,您是对的,不确定为什么我当时没有看到它。
如果您的jdk版本低于1.5,则可以使用以下选项。
int iTest = 2;
StringBuffer sTest = new StringBuffer("000000"); //if the string size is 6
sTest.append(String.valueOf(iTest));
System.out.println(sTest.substring(sTest.length()-6, sTest.length()));
-1:此解决方案过于复杂且不可扩展。
这使值变得复杂且多余。