【发布时间】:2011-05-27 01:32:45
【问题描述】:
【问题讨论】:
【问题讨论】:
你可以使用 apache commons StringUtils
StringUtils.leftPad("129018", 10, "0");
【讨论】:
String paddedString = org.apache.commons.lang.StringUtils.leftPad("129018", 10, "0")
第二个参数是想要的输出长度
“0”是填充字符
【讨论】:
String 是不可变的(请参阅String is immutable. What exactly is the meaning?),因此StringUtils.leftPad(variable, 10, "0"); 不会更改variable 的值。您需要将结果分配给它,如下所示:variable = StringUtils.leftPad(variable, 10, "0");。
这会将任何字符串填充到总宽度为 10,而无需担心解析错误:
String unpadded = "12345";
String padded = "##########".substring(unpadded.length()) + unpadded;
//unpadded is "12345"
//padded is "#####12345"
如果你想向右填充:
String unpadded = "12345";
String padded = unpadded + "##########".substring(unpadded.length());
//unpadded is "12345"
//padded is "12345#####"
您可以将“#”字符替换为您想要填充的任何字符,重复您希望字符串总宽度的次数。例如。如果您想在左侧添加零,使整个字符串长度为 15 个字符:
String unpadded = "12345";
String padded = "000000000000000".substring(unpadded.length()) + unpadded;
//unpadded is "12345"
//padded is "000000000012345"
与 khachik 的答案相比,这样做的好处是它不使用 Integer.parseInt,它可能会引发异常(例如,如果您要填充的数字太大,例如 12147483647)。缺点是,如果您要填充的内容已经是 int,那么您必须将其转换为 String 并返回,这是不可取的。
所以,如果您确定它是一个 int,那么 khachik 的答案就很有效。如果没有,那么这是一个可能的策略。
【讨论】:
要格式化字符串使用
import org.apache.commons.lang.StringUtils;
public class test {
public static void main(String[] args) {
String result = StringUtils.leftPad("wrwer", 10, "0");
System.out.println("The String : " + result);
}
}
输出:字符串:00000wrwer
第一个参数是要格式化的字符串,第二个参数是所需输出长度的长度,第三个参数是要填充字符串的字符。
使用链接下载jarhttp://commons.apache.org/proper/commons-lang/download_lang.cgi
【讨论】:
如果您需要性能并知道字符串的最大大小,请使用:
String zeroPad = "0000000000000000";
String str0 = zeroPad.substring(str.length()) + str;
注意最大字符串大小。如果它大于 StringBuffer 的大小,你会得到一个java.lang.StringIndexOutOfBoundsException。
【讨论】:
我用过这个:
DecimalFormat numFormat = new DecimalFormat("00000");
System.out.println("Code format: "+numFormat.format(123));
结果:00123
希望对你有用!
【讨论】:
我更喜欢这段代码:
public final class StrMgr {
public static String rightPad(String input, int length, String fill){
String pad = input.trim() + String.format("%"+length+"s", "").replace(" ", fill);
return pad.substring(0, length);
}
public static String leftPad(String input, int length, String fill){
String pad = String.format("%"+length+"s", "").replace(" ", fill) + input.trim();
return pad.substring(pad.length() - length, pad.length());
}
}
然后:
System.out.println(StrMgr.leftPad("hello", 20, "x"));
System.out.println(StrMgr.rightPad("hello", 20, "x"));
【讨论】:
StrMgr.leftPad 正在将填充附加到字符串,StrMgr.rightPad 正在附加。对我来说(至少),我希望左填充在字符串的前面添加填充。
这是我的解决方案:
String s = Integer.toBinaryString(5); //Convert decimal to binary
int p = 8; //preferred length
for(int g=0,j=s.length();g<p-j;g++, s= "0" + s);
System.out.println(s);
输出:00000101
【讨论】:
基于@Haroldo Macêdo's answer,我在我的自定义Utils类中创建了一个方法如
/**
* Left padding a string with the given character
*
* @param str The string to be padded
* @param length The total fix length of the string
* @param padChar The pad character
* @return The padded string
*/
public static String padLeft(String str, int length, String padChar) {
String pad = "";
for (int i = 0; i < length; i++) {
pad += padChar;
}
return pad.substring(str.length()) + str;
}
然后拨打Utils.padLeft(str, 10, "0");
【讨论】:
Satish 的解决方案在预期答案中非常好。我想通过将变量 n 添加到格式化字符串而不是 10 个字符来使其更通用。
int maxDigits = 10;
String str = "129018";
String formatString = "%"+n+"s";
String str2 = String.format(formatString, str).replace(' ', '0');
System.out.println(str2);
这适用于大多数情况
【讨论】:
使用Google Guava:
Maven:
<dependency>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
<version>14.0.1</version>
</dependency>
示例代码:
Strings.padStart("129018", 10, '0') returns "0000129018"
【讨论】:
这是一个基于 String.format 的解决方案,适用于字符串并且适用于可变长度。
public static String PadLeft(String stringToPad, int padToLength){
String retValue = null;
if(stringToPad.length() < padToLength) {
retValue = String.format("%0" + String.valueOf(padToLength - stringToPad.length()) + "d%s",0,stringToPad);
}
else{
retValue = stringToPad;
}
return retValue;
}
public static void main(String[] args) {
System.out.println("'" + PadLeft("test", 10) + "'");
System.out.println("'" + PadLeft("test", 3) + "'");
System.out.println("'" + PadLeft("test", 4) + "'");
System.out.println("'" + PadLeft("test", 5) + "'");
}
输出: '000000测试' '测试' '测试' '0测试'
【讨论】:
固定长度为 10 的右填充: String.format("%1$-10s", "abc") 固定长度为 10 的左填充: String.format("%1$10s", "abc")
【讨论】:
检查适用于整数和字符串的代码。
假设我们的第一个数字是 129018。我们想在其中添加零,因此最终字符串的长度将为 10。为此,您可以使用以下代码
int number=129018;
int requiredLengthAfterPadding=10;
String resultString=Integer.toString(number);
int inputStringLengh=resultString.length();
int diff=requiredLengthAfterPadding-inputStringLengh;
if(inputStringLengh<requiredLengthAfterPadding)
{
resultString=new String(new char[diff]).replace("\0", "0")+number;
}
System.out.println(resultString);
【讨论】:
这是另一种方法:
int pad = 4;
char[] temp = (new String(new char[pad]) + "129018").toCharArray()
Arrays.fill(temp, 0, pad, '0');
System.out.println(temp)
【讨论】:
int number = -1;
int holdingDigits = 7;
System.out.println(String.format("%0"+ holdingDigits +"d", number));
刚刚在采访中问过这个............
我的回答在下面,但是这个(上面提到的)要好得多->
String.format("%05d", num);
我的回答是:
static String leadingZeros(int num, int digitSize) {
//test for capacity being too small.
if (digitSize < String.valueOf(num).length()) {
return "Error : you number " + num + " is higher than the decimal system specified capacity of " + digitSize + " zeros.";
//test for capacity will exactly hold the number.
} else if (digitSize == String.valueOf(num).length()) {
return String.valueOf(num);
//else do something here to calculate if the digitSize will over flow the StringBuilder buffer java.lang.OutOfMemoryError
//else calculate and return string
} else {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digitSize; i++) {
sb.append("0");
}
sb.append(String.valueOf(num));
return sb.substring(sb.length() - digitSize, sb.length());
}
}
【讨论】:
String str = "129018";
StringBuilder sb = new StringBuilder();
for (int toPrepend=10-str.length(); toPrepend>0; toPrepend--) {
sb.append('0');
}
sb.append(str);
String result = sb.toString();
【讨论】:
StringBuilder的缓冲区大小,默认为16,对于大格式的大小正确设置缓冲区大小,如:StringBuilder sb = new StringBuilder();
如果你的字符串只包含数字,你可以把它变成一个整数然后做填充:
String.format("%010d", Integer.parseInt(mystring));
【讨论】:
%0更改为%yourchoice。
String.format() 支持BigInteger 像这样:String.format("%010d", new BigInteger("9999999999"))
一个老问题,但我也有两种方法。
对于固定(预定义)长度:
public static String fill(String text) {
if (text.length() >= 10)
return text;
else
return "0000000000".substring(text.length()) + text;
}
对于可变长度:
public static String fill(String text, int size) {
StringBuilder builder = new StringBuilder(text);
while (builder.length() < size) {
builder.append('0');
}
return builder.toString();
}
【讨论】:
String str = "129018";
String str2 = String.format("%10s", str).replace(' ', '0');
System.out.println(str2);
【讨论】: