web-dev-qa-db-fra.com

Limiter le nombre de caractères dans une chaîne et couper le reste

Je dois créer un tableau récapitulatif à la fin d'un journal avec certaines valeurs obtenues dans une classe. Le tableau doit être imprimé au format largeur fixe. J'ai déjà le code pour le faire, mais je dois limiter Strings, doubles et ints à une taille de largeur fixe codée en dur dans le code.

Alors, supposons que je veuille imprimer un tableau à largeur fixe avec

    int,string,double,string
    int,string,double,string
    int,string,double,string
    int,string,double,string

    and the fixed widths are: 4, 5, 6, 6.

Si une valeur dépasse cette largeur, les derniers caractères doivent être coupés. Donc par exemple:

    124891, difference, 22.348, montreal

les chaînes à imprimer doivent être:

    1248 diffe 22.348 montre

Je pense que je dois faire quelque chose dans le constructeur qui force une chaîne à ne pas dépasser un certain nombre de caractères. Je vais probablement transtyper les doublons et les entrants en chaîne afin de pouvoir appliquer les exigences de largeur maximale.

Je ne sais pas quelle méthode fait cela ou si une chaîne peut être instanciée pour se comporter de cette façon. L'utilisation du formateur n'aide que pour la mise en forme fixe de l'impression de la chaîne, mais elle ne coupe pas les caractères qui dépassent la longueur maximale.

54
Flethuseo

Utilisez ceci pour couper les caractères non nécessaires:

String.substring(0, maxLength); 

Exemple:

String aString ="123456789";
String cutString = aString.substring(0, 4);
// Output is: "1234" 

Pour vous assurer que vous n'obtenez pas d'exception IndexOutOfBoundsException lorsque la chaîne d'entrée est inférieure à la longueur attendue, procédez comme suit:

int maxLength = (inputString.length() < MAX_CHAR)?inputString.length():MAX_CHAR;
inputString = inputString.substring(0, maxLength);

Si vous voulez que vos entiers et doubles aient une certaine longueur, alors je vous suggère d'utiliser NumberFormat pour formater vos nombres au lieu de couper leur représentation en chaîne.

74
GETah

Vous pouvez également utiliser String.format("%3.3s", "abcdefgh"). Le premier chiffre est la longueur minimale (la chaîne sera laissée complétée si elle est plus courte), le deuxième chiffre est la longueur maximale et la chaîne sera tronquée si elle est plus longue. Alors

System.out.printf("'%3.3s' '%3.3s'", "abcdefgh", "a");

produira

'abc' '  a'

(vous pouvez évidemment supprimer les guillemets).

157
Jaksa

Pour la lisibilité, je préfère ceci:

if (inputString.length() > maxLength) {
    inputString = inputString.substring(0, maxLength);
}

sur la réponse acceptée.

int maxLength = (inputString.length() < MAX_CHAR)?inputString.length():MAX_CHAR;
inputString = inputString.substring(0, maxLength);
26
user3709124
25
khriskooper

Vous pouvez y arriver facilement en utilisant

    shortString = longString.substring(0, Math.min(s.length(), MAX_LENGTH));
18
Arade

Idéalement, vous devriez essayer de ne pas modifier la représentation de données interne dans le but de créer la table. Quel est le problème avec String.format ()? Cela vous retournera une nouvelle chaîne avec la largeur requise.

2
Ashwinee K Jha

La solution peut être Java.lang.String.format("%" + maxlength + "s", string).trim(), comme ceci:

int maxlength = 20;
String longString = "Any string you want which length is greather than 'maxlength'";
String shortString = "Anything short";
String resultForLong = Java.lang.String.format("%" + maxlength + "s", longString).trim();
String resultForShort = Java.lang.String.format("%" + maxlength + "s", shortString).trim();
System.out.println(resultForLong);
System.out.println(resultForShort);

ouput:

Any string you want w

Anything short

2
Moesio

Si vous voulez juste une longueur maximale, utilisez StringUtils.left! Non if ou ternary ?: nécessaire.

int maxLength = 5;
StringUtils.left(string, maxLength);

Sortie:

      null -> null
        "" -> ""
       "a" -> "a"
"abcd1234" -> "abcd1"

Left Documentation

1
Gibolt