String.format - 用点填充字符串
String.format - Fill a String with dots
我有两个字符串。
String a = "Abraham"
String b = "Best Friend"
我想要类似这样的输出:
Abraham.......OK
Best Friend...OK
我使用 String.format() 得到以下结果。
a = String.format("%0$-" + b.lenght() + "s ", a);
b = String.format("%0$-" + b.lenght() + "s ", b);
Abraham OK
Best Friend OK
我不能使用String.replace(),因为"Best"和"Friend"之间的space也会被替换。
我找到了将零放在字符串开头的解决方案。但是,我不明白我应该以何种方式修改此解决方案以获得所需的输出。
answer by anubhava
String sendID = "AABB";
String output = String.format("%0"+(32-sendID.length())+"d%s", 0, sendID);
我找到了填充字符串的解决方案,但我想用 String.format()-方法解决这个问题。
出于性能原因,我可能会为此使用循环(以及 StringBuilder
:
public String pad(String source, int targetLength, String pad) {
StringBuilder result = new StringBuilder( source );
for( int i = source.length(); i < targetLength; i+=pad.length() ) {
result.append(pad);
}
return result.toString();
}
//calling:
a = pad( a, 32, "." );
请注意,如果 targetLength - source.length()
不是 pad.length()
的倍数,这将提前停止。要解决此问题,要么只传递单个字符,要么使用具有适当值的 pad.substring(...)
来处理最后一部分。
编辑:
这是 pad.subString(...)
的版本:
public String pad(String source, int targetLength, String pad) {
StringBuilder result = new StringBuilder( source );
while( result.length() < targetLength ) {
result.append(pad.substring( 0, Math.min( pad.length(), targetLength - result.length() ) ));
}
return result.toString();
}
只是一个想法..
public class Test {
public static void main(String[] args) {
String TEN_DOTS = "..........";
String TEST_STR = "foo";
String outstr = TEST_STR + TEN_DOTS;
System.out.println(outstr.substring(0,10));
}
}
输出:
foo.......
您可以像这样将 replaceAll()
与正则表达式一起使用:
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
String arr[] = {"Abraham", "Best Friend"};
for(String s:arr)
System.out.println(String.format("%-"+32+"s", s).replaceAll("\s(?=\s+$|$)", ".")+"OK");
}
}
输出:
Abraham.........................OK
Best Friend.....................OK
一个简单的递归方法是:
public static String fill(String s, int l){
if(s.length()==l)
return s; // Return the String , as the task is complete
else
return fill(s+".",l); // Append 1 .(dot) and again call the method
}
这是我能想到的最简单的方法。
所以,对你来说,应该是:
a = fill(a,b.length());
b = fill(b,b.length());
从 Java 11 开始,我们可以使用 String.repeat(int count) 来复制字符串 count 次。
public static String padLeft(String source, int targetLength, Character pad) {
return String.valueOf(pad).repeat(Math.max(0, targetLength - source.length())) + source;
}
public static String padRight(String source, int targetLength, Character pad) {
return source + String.valueOf(pad).repeat(Math.max(0, targetLength - source.length()));
}
我有两个字符串。
String a = "Abraham"
String b = "Best Friend"
我想要类似这样的输出:
Abraham.......OK
Best Friend...OK
我使用 String.format() 得到以下结果。
a = String.format("%0$-" + b.lenght() + "s ", a);
b = String.format("%0$-" + b.lenght() + "s ", b);
Abraham OK
Best Friend OK
我不能使用String.replace(),因为"Best"和"Friend"之间的space也会被替换。
我找到了将零放在字符串开头的解决方案。但是,我不明白我应该以何种方式修改此解决方案以获得所需的输出。
answer by anubhava
String sendID = "AABB";
String output = String.format("%0"+(32-sendID.length())+"d%s", 0, sendID);
我找到了填充字符串的解决方案,但我想用 String.format()-方法解决这个问题。
出于性能原因,我可能会为此使用循环(以及 StringBuilder
:
public String pad(String source, int targetLength, String pad) {
StringBuilder result = new StringBuilder( source );
for( int i = source.length(); i < targetLength; i+=pad.length() ) {
result.append(pad);
}
return result.toString();
}
//calling:
a = pad( a, 32, "." );
请注意,如果 targetLength - source.length()
不是 pad.length()
的倍数,这将提前停止。要解决此问题,要么只传递单个字符,要么使用具有适当值的 pad.substring(...)
来处理最后一部分。
编辑:
这是 pad.subString(...)
的版本:
public String pad(String source, int targetLength, String pad) {
StringBuilder result = new StringBuilder( source );
while( result.length() < targetLength ) {
result.append(pad.substring( 0, Math.min( pad.length(), targetLength - result.length() ) ));
}
return result.toString();
}
只是一个想法..
public class Test {
public static void main(String[] args) {
String TEN_DOTS = "..........";
String TEST_STR = "foo";
String outstr = TEST_STR + TEN_DOTS;
System.out.println(outstr.substring(0,10));
}
}
输出:
foo.......
您可以像这样将 replaceAll()
与正则表达式一起使用:
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
String arr[] = {"Abraham", "Best Friend"};
for(String s:arr)
System.out.println(String.format("%-"+32+"s", s).replaceAll("\s(?=\s+$|$)", ".")+"OK");
}
}
输出:
Abraham.........................OK
Best Friend.....................OK
一个简单的递归方法是:
public static String fill(String s, int l){
if(s.length()==l)
return s; // Return the String , as the task is complete
else
return fill(s+".",l); // Append 1 .(dot) and again call the method
}
这是我能想到的最简单的方法。
所以,对你来说,应该是:
a = fill(a,b.length());
b = fill(b,b.length());
从 Java 11 开始,我们可以使用 String.repeat(int count) 来复制字符串 count 次。
public static String padLeft(String source, int targetLength, Character pad) {
return String.valueOf(pad).repeat(Math.max(0, targetLength - source.length())) + source;
}
public static String padRight(String source, int targetLength, Character pad) {
return source + String.valueOf(pad).repeat(Math.max(0, targetLength - source.length()));
}