Comment puis-je pad une chaîne en Java?
Existe-t-il un moyen facile de tamponner des chaînes en Java?
Semble être quelque chose qui devrait être dans une API de type StringUtil, mais je ne trouve rien qui fasse cela.
26 answers
Apache StringUtils
a plusieurs méthodes: leftPad
, rightPad
, center
et repeat
.
, Mais veuillez noter que comme d'autres l'ont mentionné et illustré dans cette réponse - String.format()
et la Formatter
les classes du JDK sont de meilleures options. Utilisez-les sur le code commons.
Depuis Java 1.5, String.format()
peut être utilisé à gauche/droite pad d'une chaîne donnée.
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*
*/
Remplissage à 10 caractères:
String.format("%10s", "foo").replace(' ', '*');
String.format("%-10s", "bar").replace(' ', '*');
String.format("%10s", "longer than 10 chars").replace(' ', '*');
Sortie:
*******foo
bar*******
longer*than*10*chars
Afficher ' * ' pour les caractères du mot de passe:
String password = "secret123";
String padded = String.format("%"+password.length()+"s", "").replace(' ', '*');
La sortie a la même longueur que la chaîne de mot de passe:
secret123
*********
Dans Goyave, c'est facile:
Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');
Quelque Chose de simple:
La valeur doit être une chaîne. convertissez - le en chaîne, si ce n'est pas le cas. Comme "" + 123
ou Integer.toString(123)
// let's assume value holds the String we want to pad
String value = "123";
La sous-chaîne commence à partir de la valeur length char index jusqu'à la fin length of padded:
String padded="00000000".substring(value.length()) + value;
// now padded is "00000123"
Plus précis
Pavé droit:
String padded = value + ("ABCDEFGH".substring(value.length()));
// now padded is "123DEFGH"
Pad gauche:
String padString = "ABCDEFGH";
String padded = (padString.substring(0, padString.length() - value.length())) + value;
// now padded is "ABCDE123"
Jetez un oeil à org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar)
.
Mais l'algorithme est très simple (pad jusqu'à la taille des caractères):
public String pad(String str, int size, char padChar)
{
StringBuffer padded = new StringBuffer(str);
while (padded.length() < size)
{
padded.append(padChar);
}
return padded.toString();
}
Outre Apache Commons, voir aussi String.format
qui devrait pouvoir prendre en charge un remplissage simple (par exemple avec des espaces).
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...
Cela m'a pris un peu de temps pour comprendre. La vraie clé est de lire cette documentation du formateur.
// 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
"%1$32x",
digest
);
// Replace the blank padding with 0s.
hex = hex.replace(" ","0");
System.out.println(hex);
Je sais que ce thread est un peu vieux et que la question d'origine était une solution facile, mais s'il est censé être très rapide, vous devriez utiliser un tableau de caractères.
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;
}
La solution du formateur n'est pas optimale. la simple construction de la chaîne de format crée 2 nouvelles chaînes.
La solution d'Apache peut être améliorée en initialisant le sb avec la taille cible afin de remplacer ci-dessous
StringBuffer padded = new StringBuffer(str);
Avec
StringBuffer padded = new StringBuffer(pad);
padded.append(value);
Empêcherait le tampon interne du sb de croître.
Voici une autre façon de pad à droite:
// 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-------";
Vous pouvez réduire la surcharge par appel en conservant les données de remplissage, plutôt que de les reconstruire à chaque fois:
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);
}
}
Comme alternative, vous pouvez faire de la longueur du résultat un paramètre de la méthode pad(...)
. Dans ce cas, effectuez l'ajustement du remplissage caché dans cette méthode au lieu de dans le constructeur.
(Indice: Pour un crédit supplémentaire, faites-le thread-safe! ;-)
Vous pouvez utiliser les méthodes intégrées StringBuilder append() et insert() , pour le remplissage de longueurs de chaîne variables:
AbstractStringBuilder append(CharSequence s, int start, int end) ;
Par exemple:
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());
Cela fonctionne:
"".format("%1$-" + 9 + "s", "XXX").replaceAll(" ", "0")
Il remplira votre chaîne XXX jusqu'à 9 Caractères avec un espace. Après cela, tous les espaces blancs seront remplacés par un 0. Vous pouvez changer les espaces et le 0 à ce que vous voulez...
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 "";
}
Laissez-moi une réponse pour certains cas où vous devez donner un remplissage gauche/droite (ou une chaîne de préfixe/suffixe ou des espaces) avant de concaténer à une autre chaîne et vous ne voulez pas tester la longueur ou toute condition if.
La même chose à la réponse sélectionnée, je préférerais leStringUtils
d'Apache Commons mais en utilisant de cette façon:
StringUtils.defaultString(StringUtils.leftPad(myString, 1))
Expliquer:
-
myString
: la chaîne que j'ai entrée peut être nulle -
StringUtils.leftPad(myString, 1)
: si string vaut null, cette instruction retournera null aussi - , puis utilisez
defaultString
pour donner une chaîne vide pour éviter concaténer null
Trouvé ceci sur Dzone
Pad avec des zéros:
String.format("|%020d|", 93); // prints: |00000000000000000093|
java.util.Formatter
fera le rembourrage gauche et droit. Pas besoin de dépendances tierces étranges (voudriez-vous les ajouter pour quelque chose de si trivial).
[J'ai laissé de côté les détails et fait de ce post 'community wiki' car ce n'est pas quelque chose dont j'ai besoin.]
@les réponses de ck et @Marlon Tarak sont les seules à utiliser un char[]
, ce qui pour les applications qui ont plusieurs appels à des méthodes de remplissage par seconde est la meilleure approche. Cependant, ils ne profitent d'aucune optimisation de manipulation de tableau et sont un peu écrasés à mon goût; cela peut être fait avec pas de boucles du tout.
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);
}
Méthode d'essai simple:
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));
}
Sorties:
012345678901234567890123456789
cats
cats
cats
cats$$$$$$$$$$$$$$$$$$$$$$$$$$
too long for your own good, buddy
Utilisez cette fonction.
private String leftPadding(String word, int length, char ch) {
return (length > word.length()) ? leftPadding(ch + word, length, ch) : word;
}
Comment utiliser?
leftPadding(month, 2, '0');
Sortie: 01 02 03 04 .. 11 12
Une solution simple sans API sera la suivante:
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, pas de bibliothèque de fantaisie.
// 6 characters padding example
String pad = "******";
// testcases for 0, 4, 8 characters
String input = "" | "abcd" | "abcdefgh"
Pad gauche, ne limitez pas
result = pad.substring(Math.min(input.length(),pad.length())) + input;
results: "******" | "**abcd" | "abcdefgh"
Pad Droit, ne limitez pas
result = input + pad.substring(Math.min(input.length(),pad.length()));
results: "******" | "abcd**" | "abcdefgh"
Pad gauche, limite à la longueur du pad
result = (pad + input).substring(input.length(), input.length() + pad.length());
results: "******" | "**abcd" | "cdefgh"
Pad Droit, limite à pad longueur
result = (input + pad).substring(0, pad.length());
results: "******" | "abcd**" | "abcdef"
Toutes les opérations stringdoivent généralement être très efficaces - surtout si vous travaillez avec de gros ensembles de données. Je voulais quelque chose de rapide et flexible, similaire à ce que vous obtiendrez dans la commande plsql pad. De plus, je ne veux pas inclure une énorme bibliothèque pour une seule petite chose. Compte tenu de ces considérations, aucune de ces solutions n'était satisfaisante. Ce sont les solutions que j'ai proposées, qui ont eu les meilleurs résultats de benchmarking, si quelqu'un peut l'améliorer, veuillez ajouter votre commentaire.
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;
}
}
- note il est appelé avec une chaîne.toCharArray() et le résultat peut être converti en chaîne avec new String ((char[])result). La raison en est que si vous appliquez plusieurs opérations, vous pouvez toutes les faire sur char[] et ne pas continuer à convertir entre les formats - dans les coulisses, String est stocké en tant que char[]. Si ces opérations étaient incluses dans la classe String elle - même, cela aurait été deux fois plus efficace-vitesse et mémoire.
Beaucoup de gens ont des techniques très intéressantes mais j'aime garder les choses simples alors je vais avec ceci:
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();
}
Une solution simple serait:
package nl;
public class Padder {
public static void main(String[] args) {
String s = "123" ;
System.out.println("#"+(" " + s).substring(s.length())+"#");
}
}
Comment est-ce
String est " hello "et le remplissage requis est 15 avec" 0 " pad gauche
String ax="Hello";
while(ax.length() < 15) ax="0"+ax;