26 ответов:
Начиная С Java 1.5,
String.format()может использоваться для левой / правой панели заданной строки.public static String padRight(String s, int n) { return String.format("%1$-" + n + "s", s); } public static String padLeft(String s, int n) { return String.format("%1$" + n + "s", s); } ... public static void main(String args[]) throws Exception { System.out.println(padRight("Howto", 20) + "*"); System.out.println(padLeft("Howto", 20) + "*"); } /* output : Howto * Howto* */
отступ до 10 символов:
String.format("%10s", "foo").replace(' ', '*'); String.format("%-10s", "bar").replace(' ', '*'); String.format("%10s", "longer than 10 chars").replace(' ', '*');выход:
*******foo bar******* longer*than*10*charsотображение ' * ' для символов пароля:
String password = "secret123"; String padded = String.format("%"+password.length()+"s", "").replace(' ', '*');вывод имеет ту же длину, что и строка пароля:
secret123 *********
In гуавы, Это очень просто:
Strings.padStart("string", 10, ' '); Strings.padEnd("string", 10, ' ');
что-нибудь простое:
значение должно быть строкой. преобразовать его в строку, если это не так. Как
"" + 123илиInteger.toString(123)// let's assume value holds the String we want to pad String value = "123";подстрока начинается от значения length char index до конечной длины padded:
String padded="00000000".substring(value.length()) + value; // now padded is "00000123"точнее
pad right:
String padded = value + ("ABCDEFGH".substring(value.length())); // now padded is "123DEFGH"pad слева:
String padString = "ABCDEFGH"; String padded = (padString.substring(0, padString.length() - value.length())) + value; // now padded is "ABCDE123"
посмотреть
org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar).но алгоритм очень прост (pad прямо до размера символов):
public String pad(String str, int size, char padChar) { StringBuffer padded = new StringBuffer(str); while (padded.length() < size) { padded.append(padChar); } return padded.toString(); }
кроме Apache Commons, Также см.
String.formatкоторый должен быть в состоянии позаботиться о простом заполнении (например, с пробелами).
public static String LPad(String str, Integer length, char car) { return str + String.format("%" + (length - str.length()) + "s", "") .replace(" ", String.valueOf(car)); } public static String RPad(String str, Integer length, char car) { return String.format("%" + (length - str.length()) + "s", "") .replace(" ", String.valueOf(car)) + str; } LPad("Hi", 10, 'R') //gives "RRRRRRRRHi" RPad("Hi", 10, 'R') //gives "HiRRRRRRRR" RPad("Hi", 10, ' ') //gives "Hi " //etc...
это заняло у меня немного времени, чтобы понять. Реальный ключ-прочитать эту документацию по форматированию.
// Get your data from wherever. final byte[] data = getData(); // Get the digest engine. final MessageDigest md5= MessageDigest.getInstance("MD5"); // Send your data through it. md5.update(data); // Parse the data as a positive BigInteger. final BigInteger digest = new BigInteger(1,md5.digest()); // Pad the digest with blanks, 32 wide. String hex = String.format( // See: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html // Format: %[argument_index$][flags][width]conversion // Conversion: 'x', 'X' integral The result is formatted as a hexadecimal integer "%1x", digest ); // Replace the blank padding with 0s. hex = hex.replace(" ","0"); System.out.println(hex);
Я знаю, что этот поток довольно старый, и исходный вопрос был для легкого решения, но если он должен быть очень быстрым, вы должны использовать массив символов.
public static String pad(String str, int size, char padChar) { if (str.length() < size) { char[] temp = new char[size]; int i = 0; while (i < str.length()) { temp[i] = str.charAt(i); i++; } while (i < size) { temp[i] = padChar; i++; } str = new String(temp); } return str; }решение форматирования не является оптимальным. просто построение строки формата создает 2 новые строки.
решение apache может быть улучшено путем инициализации sb с целевым размером, поэтому замена ниже
StringBuffer padded = new StringBuffer(str);С
StringBuffer padded = new StringBuffer(pad); padded.append(value);предотвратил бы внутренний sb буфер от роста.
вот еще один способ прокладки вправо:
// put the number of spaces, or any character you like, in your paddedString String paddedString = "--------------------"; String myStringToBePadded = "I like donuts"; myStringToBePadded = myStringToBePadded + paddedString.substring(myStringToBePadded.length()); //result: myStringToBePadded = "I like donuts-------";
вы можете уменьшить накладные расходы на каждый вызов, сохраняя данные заполнения, а не перестраивая его каждый раз:
public class RightPadder { private int length; private String padding; public RightPadder(int length, String pad) { this.length = length; StringBuilder sb = new StringBuilder(pad); while (sb.length() < length) { sb.append(sb); } padding = sb.toString(); } public String pad(String s) { return (s.length() < length ? s + padding : s).substring(0, length); } }в качестве альтернативы вы можете сделать длину результата параметром
pad(...)метод. В этом случае выполните настройку скрытого заполнения в этом методе, а не в конструкторе.(подсказка: для дополнительного кредита, сделать его потокобезопасным! ; -)
вы можете использовать встроенные методы StringBuilder append() и insert() , для заполнения переменной длины строки:
AbstractStringBuilder append(CharSequence s, int start, int end) ;Например:
private static final String MAX_STRING = " "; //20 spaces Set<StringBuilder> set= new HashSet<StringBuilder>(); set.add(new StringBuilder("12345678")); set.add(new StringBuilder("123456789")); set.add(new StringBuilder("1234567811")); set.add(new StringBuilder("12345678123")); set.add(new StringBuilder("1234567812234")); set.add(new StringBuilder("1234567812222")); set.add(new StringBuilder("12345678122334")); for(StringBuilder padMe: set) padMe.append(MAX_STRING, padMe.length(), MAX_STRING.length());
это работает:
"".format("%1$-" + 9 + "s", "XXX").replaceAll(" ", "0")он заполнит вашу строку XXX до 9 символов пробелом. После этого все пробелы будут заменены на 0. Вы можете изменить пробелы и 0 на все, что вы хотите...
public static String padLeft(String in, int size, char padChar) { if (in.length() <= size) { char[] temp = new char[size]; /* Llenado Array con el padChar*/ for(int i =0;i<size;i++){ temp[i]= padChar; } int posIniTemp = size-in.length(); for(int i=0;i<in.length();i++){ temp[posIniTemp]=in.charAt(i); posIniTemp++; } return new String(temp); } return ""; }
Давайте я оставлю ответ для некоторых случаев, когда вам нужно дать левое/правое заполнение (или префикс/суффикс строка или пробелы) перед конкатенацией с другой строкой, и вы не хотите проверять длину или любое условие if.
то же самое к выбранному ответу, я бы предпочел
StringUtilsиз Apache Commons, Но используя этот способ:StringUtils.defaultString(StringUtils.leftPad(myString, 1))объясняю:
myString: строка ввода I, может быть nullStringUtils.leftPad(myString, 1): если строка имеет значение null, этот оператор тоже вернет null- затем использовать
defaultStringчтобы дать пустую строку, чтобы предотвратить конкатенацию null
нашел на Dzone
Pad с нулями:
String.format("|%020d|", 93); // prints: |00000000000000000093|
java.util.Formatterбудет делать левый и правый отступы. Нет необходимости в нечетных зависимостях от третьих сторон (вы хотите добавить их для чего-то настолько тривиального).[Я опустил детали и сделал этот пост "Community wiki", поскольку это не то, что мне нужно.]
@ckи @Marlon Tarakответы являются единственными, чтобы использовать
char[], что для приложений, которые имеют несколько вызовов методов заполнения в секунду является лучшим подходом. Однако они не используют никаких оптимизаций манипуляций с массивами и немного перезаписаны на мой вкус; это можно сделать с помощью никаких петель вообще.public static String pad(String source, char fill, int length, boolean right){ if(source.length() > length) return source; char[] out = new char[length]; if(right){ System.arraycopy(source.toCharArray(), 0, out, 0, source.length()); Arrays.fill(out, source.length(), length, fill); }else{ int sourceOffset = length - source.length(); System.arraycopy(source.toCharArray(), 0, out, sourceOffset, source.length()); Arrays.fill(out, 0, sourceOffset, fill); } return new String(out); }простой метод испытания:
public static void main(String... args){ System.out.println("012345678901234567890123456789"); System.out.println(pad("cats", ' ', 30, true)); System.out.println(pad("cats", ' ', 30, false)); System.out.println(pad("cats", ' ', 20, false)); System.out.println(pad("cats", '$', 30, true)); System.out.println(pad("too long for your own good, buddy", '#', 30, true)); }выходы:
012345678901234567890123456789 cats cats cats cats$$$$$$$$$$$$$$$$$$$$$$$$$$ too long for your own good, buddy
использовать эту функцию.
private String leftPadding(String word, int length, char ch) { return (length > word.length()) ? leftPadding(ch + word, length, ch) : word; }Как использовать?
leftPadding(month, 2, '0');выход: 01 02 03 04 .. 11 12
простое решение без какого-либо API будет выглядеть следующим образом:
public String pad(String num, int len){ if(len-num.length() <=0) return num; StringBuffer sb = new StringBuffer(); for(i=0; i<(len-num.length()); i++){ sb.append("0"); } sb.append(num); return sb.toString(); }
Java oneliners, нет фантазии библиотеки.
// 6 characters padding example String pad = "******"; // testcases for 0, 4, 8 characters String input = "" | "abcd" | "abcdefgh"Pad слева, не ограничивайте
result = pad.substring(Math.min(input.length(),pad.length())) + input; results: "******" | "**abcd" | "abcdefgh"Pad справа, не ограничивайте
result = input + pad.substring(Math.min(input.length(),pad.length())); results: "******" | "abcd**" | "abcdefgh"Pad слева, ограничьте длину pad
result = (pad + input).substring(input.length(), input.length() + pad.length()); results: "******" | "**abcd" | "cdefgh"Pad справа, ограничьте длину колодки
result = (input + pad).substring(0, pad.length()); results: "******" | "abcd**" | "abcdef"
все строка операция обычно должна быть очень эффективным!--3--> - особенно если вы работаете с большими наборами данных. Я хотел что-то быстрое и гибкое, похожее на то, что вы получите в команде plsql pad. Кроме того, я не хочу включать огромную lib только для одной маленькой вещи. С учетом этих соображений ни одно из этих решений не было удовлетворительным. Это те решения, которые я придумал, которые имели лучшие результаты бенчмаркинга, если кто-то может улучшить его, пожалуйста, добавьте свой комментарий.
public static char[] lpad(char[] pStringChar, int pTotalLength, char pPad) { if (pStringChar.length < pTotalLength) { char[] retChar = new char[pTotalLength]; int padIdx = pTotalLength - pStringChar.length; Arrays.fill(retChar, 0, padIdx, pPad); System.arraycopy(pStringChar, 0, retChar, padIdx, pStringChar.length); return retChar; } else { return pStringChar; } }
- обратите внимание, что он называется строкой.toCharArray () и результат может быть преобразован в строку с новой строкой((char []) результат). Причина этого заключается в том, что если вы применяете несколько операций, вы можете сделать их все на char[] и не продолжать конвертировать между форматами - за кулисами строка хранится как char[]. Если бы эти операции были включены в сам класс String, это было бы вдвое эффективнее-скорость и память мудрый.
многие люди имеют некоторые очень интересные методы, но мне нравится держать его простым, поэтому я иду с этим:
public static String padRight(String s, int n, char padding){ StringBuilder builder = new StringBuilder(s.length() + n); builder.append(s); for(int i = 0; i < n; i++){ builder.append(padding); } return builder.toString(); } public static String padLeft(String s, int n, char padding) { StringBuilder builder = new StringBuilder(s.length() + n); for(int i = 0; i < n; i++){ builder.append(Character.toString(padding)); } return builder.append(s).toString(); } public static String pad(String s, int n, char padding){ StringBuilder pad = new StringBuilder(s.length() + n * 2); StringBuilder value = new StringBuilder(n); for(int i = 0; i < n; i++){ pad.append(padding); } return value.append(pad).append(s).append(pad).toString(); }
простое решение было:
package nl; public class Padder { public static void main(String[] args) { String s = "123" ; System.out.println("#"+(" " + s).substring(s.length())+"#"); } }
Как это
строка " привет "и требуется заполнение 15 С" 0 " левая панель
String ax="Hello"; while(ax.length() < 15) ax="0"+ax;
Comments