Disons que nous avons un nom défini sur "Ben Bright". Je veux envoyer à l'utilisateur "BB", avec les premiers caractères de chaque mot. J'ai essayé avec la méthode split() , mais je n'ai pas réussi à le faire avec dart.
String getInitials(bank_account_name) {
List<String> names = bank_account_name.split(" ");
String initials;
for (var i = 0; i < names.length; i++) {
initials = '${names[i]}';
}
return initials;
}
4 Réponses :
String getInitials({String string, int limitTo}) {
var buffer = StringBuffer();
var split = string.split(' ');
for (var i = 0 ; i < (limitTo ?? split.length); i ++) {
buffer.write(split[i][0]);
}
return buffer.toString();
}
@ na2axl Je ne savais pas qu'il avait besoin de plus de 2 mots, veuillez consulter la solution mise à jour.
J'ai une erreur de plage (d'index). J'utilise cette fonction pour un listView.
Comment puis-je m'assurer qu'il renvoie toujours deux lettres même si les mots sont supérieurs à 2?
Je viens de découvrir que cela ne fonctionne que pour au moins trois mots. J'obtiens cette erreur (RangeError (index): valeur non valide: la plage de valeurs valide est vide: 0) en essayant d'utiliser pour deux mots
@bensofter C'était une solution facile, vous split.length utiliser split.length au lieu de 2 , j'ai mis à jour le code, veuillez le voir.
Juste une légère modification car vous n'avez besoin que des premières lettres
String getInitials(bank_account_name) {
List<String> names = bank_account_name.split(" ");
String initials = "";
int numWords = 2;
if(numWords < names.length) {
numWords = names.length;
}
for(var i = 0; i < numWords; i++){
initials += '${names[i][0]}';
}
return initials;
}
Éditer:
num_words pour imprimer les initiales de ces nombreux mots.bank_account_name est un mot de 0 lettre, alors renvoie une chaîne videbank_account_name contient moins de mots que num_words , imprimez les initiales de tous les mots de bank_account_name .J'ai une erreur de plage. Comment puis-je m'assurer qu'il renvoie toujours deux lettres même si les mots sont supérieurs à 2?
Avez-vous besoin des initiales des 2 premiers mots seulement? Vous pouvez maintenant vérifier la modification.
Je viens de découvrir que cela ne fonctionne que pour au moins trois mots. J'obtiens cette erreur (RangeError (index): valeur non valide: la plage de valeurs valide est vide: 0) en essayant d'utiliser pour deux mots
Le code plus ancien produit lorsqu'une erreur un mot de 0 ou 1 lettre a été passé en paramètre. J'ai fait de nouvelles modifications. Devrait bien fonctionner maintenant! :)
Permettez-moi de donner une solution plus courte que l'autre mentionnée:
void main() {
print(getInitials('')); //
print(getInitials('Ben')); // B
print(getInitials('Ben ')); // B
print(getInitials('Ben Bright')); // BB
print(getInitials('Ben Bright Big')); // BB
}
String getInitials(String bank_account_name) => bank_account_name.isNotEmpty
? bank_account_name.trim().split(' ').map((l) => l[0]).take(2).join()
: '';
La partie take(2) garantit que nous ne prenons que deux lettres.
J'ai un problème frérot. J'ai un listView dans lequel je chante cette fonction pour définir la partie principale du widget. Ce code ne fonctionne que pour au moins trois mots. Lorsque les boucles atteignent des listes contenant moins de mots, j'obtiens cette erreur. (RangeError (index): valeur non valide: la plage de valeurs valide est vide: 0)
Ok, donc vous avez des noms là-bas sont vides? Parce que cela devrait fonctionner comme vous pouvez le voir avec un seul mot.
J'ai mis à jour ma solution pour qu'elle soit plus stable contre les boîtiers d'angle. Si cela ne fonctionne toujours pas, je serai heureux si vous pouviez fournir des chaînes de test afin que je puisse créer une méthode qui fonctionne pour vos cas.
Une solution plus générale peut être trouvée ci-dessous. Il prend en charge les chaînes vides, les chaînes de mots uniques et les situations où le nombre de mots anticipé est inférieur au nombre de mots réel:
static String getInitials(String string, {int limitTo}) {
var buffer = StringBuffer();
var wordList = string.trim().split(' ');
if (string.isEmpty)
return string;
// Take first character if string is a single word
if (wordList.length <= 1)
return string.characters.first;
/// Fallback to actual word count if
/// expected word count is greater
if (limitTo != null && limitTo > wordList.length) {
for (var i = 0; i < wordList.length; i++) {
buffer.write(wordList[i][0]);
}
return buffer.toString();
}
// Handle all other cases
for (var i = 0; i < (limitTo ?? wordList.length); i++) {
buffer.write(wordList[i][0]);
}
return buffer.toString();
}
Éditer:
J'utilise en fait ceci pour CircleAvatar s sans images dans mes projets.