Je sais qu'il existe de nombreuses méthodes upper()
en Java et dans d'autres frameworks comme Apache commons lang, qui convertissent une chaîne en toutes les majuscules.
Existe-t-il des bibliothèques communes fournissant une méthode telle que isUpper(String s)
et isLower(String s)
, pour vérifier si tous les caractères de la chaîne sont en majuscule ou en minuscule?
MODIFIER:
Beaucoup de bonnes réponses sur la conversion en Upper et la comparaison à celle-ci. Je suppose que j'aurais dû être un peu plus précis et dire que j'avais déjà pensé à cela, mais j'espérais pouvoir utiliser une méthode existante pour cela.
Bon commentaire sur l'inclusion possible de cela dans Apache.commons.lang.StringUtils . Quelqu'un a même soumis un correctif (20090310). Espérons que nous verrons cela bientôt . https://issues.Apache.org/jira/browse/LANG-471
MODIFIER:
J'avais besoin de cette méthode pour mettre en majuscule les noms d’hôtels parfois en majuscules. Je voulais seulement les mettre en majuscules s'ils étaient tous en minuscules ou majuscules… .J'ai rencontré les problèmes de caractères non-lettres mentionnés dans certains posts, et j'ai fini par faire quelque chose comme ça:
private static boolean isAllUpper(String s) {
for(char c : s.toCharArray()) {
if(Character.isLetter(c) && Character.isLowerCase(c)) {
return false;
}
}
return true;
}
Cette discussion et les différentes solutions (avec différents problèmes) montrent clairement qu’il est nécessaire de disposer d’une bonne méthode solide isAllUpper (String s) dans commons.lang.
Jusque-là, je suppose que myString.toUpperCase().equals(myString)
est la meilleure solution.
Guava's CharMatchers ont tendance à offrir des solutions très expressives et efficaces à ce type de problème.
CharMatcher.javaUpperCase().matchesAllOf("AAA"); // true
CharMatcher.javaUpperCase().matchesAllOf("A SENTENCE"); // false
CharMatcher.javaUpperCase().or(CharMatcher.whitespace()).matchesAllOf("A SENTENCE"); // true
CharMatcher.javaUpperCase().or(CharMatcher.javaLetter().negate()).matchesAllOf("A SENTENCE"); // true
CharMatcher.javaLowerCase().matchesNoneOf("A SENTENCE"); // true
Une importation statique pour com.google.common.base.CharMatcher.*
peut aider à les rendre plus succinctes.
javaLowerCase().matchesNoneOf("A SENTENCE"); // true
Maintenant dans StringUtils isAllUpperCase
Malheureusement, ce n'est pas une fonction de bibliothèque, mais il est assez facile de lancer la vôtre. Si l'efficacité est une préoccupation, cela pourrait être plus rapide que s.toUpperCase (). Est égal à (s), car il peut se libérer plus tôt.
public static boolean isUpperCase(String s)
{
for (int i=0; i<s.length(); i++)
{
if (!Character.isUpperCase(s.charAt(i)))
{
return false;
}
}
return true;
}
Edit: Comme d’autres afficheurs et commentateurs l’ont noté, nous devons prendre en compte le comportement de la chaîne lorsque celle-ci contient des caractères autres que des lettres: isUpperCase ("HELLO1") doit-il renvoyer true ou false? La fonction ci-dessus retournera false car '1' n'est pas un caractère majuscule, mais ce n'est peut-être pas le comportement que vous souhaitez. Une autre définition qui renverrait true dans ce cas serait:
public static boolean isUpperCase2(String s)
{
for (int i=0; i<s.length(); i++)
{
if (Character.isLowerCase(s.charAt(i)))
{
return false;
}
}
return true;
}
Pas que je sache.
Vous pouvez copier la chaîne et convertir la copie en minuscule/majuscule et la comparer à celle d'origine.
Ou créez une boucle qui vérifie les caractères simples si ils sont en minuscule ou en majuscule.
Ceci si condition peut obtenir le résultat attendu:
String input = "ANYINPUT";
if(input.equals(input.toUpperCase())
{
// input is all upper case
}
else if (input.equals(input.toLowerCase())
{
// input is all lower case
}
else
{
// input is mixed case
}
Cette méthode est peut-être plus rapide que de comparer une chaîne à sa version majuscule, car elle ne nécessite qu'une seule passe:
public static boolean isUpper(String s)
{
for(char c : s.toCharArray())
{
if(! Character.isUpperCase(c))
return false;
}
return true;
}
Veuillez noter qu'il peut y avoir des problèmes de localisation avec différents jeux de caractères. Je n'ai aucune expérience pratique, mais je pense qu'il existe certaines langues (comme le turc) où différentes lettres minuscules peuvent correspondre à la même lettre majuscule.
Essayez ceci, peut aider.
import Java.util.regex.Pattern;
private static final String regex ="^[A-Z0-9]"; //alpha-numeric uppercase
public static boolean isUpperCase(String str){
return Pattern.compile(regex).matcher(str).find();
}
avec ce code, nous changeons simplement la regex.
Vous pouvez utiliser Java.lang.Character.isUpperCase () Vous pouvez ensuite écrire facilement une méthode qui vérifie si votre chaîne est en majuscule (avec une simple boucle).
Envoyer le message toUpperCase () à votre chaîne, puis vérifier si le résultat est égal à votre chaîne sera probablement plus lent.