Як писати велику літеру першої літери рядка дротиком?


88

Як написати великі літери першого символу рядка, не змінюючи регістр будь-якої іншої літери?

Наприклад, "це рядок" має давати "Це рядок".

Відповіді:


88

Починаючи з версії dart 2.6, dart підтримує розширення:

extension StringExtension on String {
    String capitalize() {
      return "${this[0].toUpperCase()}${this.substring(1)}";
    }
}

Тож ви можете просто зателефонувати своєму розширенню так:

import "string_extension.dart";

var someCapitalizedString = "someString".capitalize();

5
Подовження повинно повернутися return "${this[0].toUpperCase()}${this.substring(1).toLowerCase()}";. Якщо це не так, він правильно напише великі літери "це", але не "ЦЕ".
Лучано Родрігес,

3
ти зазвичай не перевіряєш, чи є дійсним значення перед тим, як з ним працювати?
Ханна Старк

Нам або потрібно перевірити, чи isEmpty усередині великих літер (), або залишити це до абонента. Я віддаю перевагу абоненту, тому код не повинен бути засмічений чеками .isEmpty (). Ви можете додати if (isEmpty) return thisяк перший рядок.
Венкат Д.

Потрібно перевірити, чи не пусте це, щоб уникнути аварії. я не думаю, що toLowerCase () зазнає аварії з порожнім рядком, а також не повинно й ваше розширення
Лукас Чве,

1
Вам слід додати кілька чеків, якщо рядок не має значення null - наприклад: if (this == null || this == "") return "";
Maciej

94

Скопіюйте це десь:

extension CapExtension on String {
  String get inCaps => '${this[0].toUpperCase()}${this.substring(1)}';
  String get allInCaps => this.toUpperCase();
  String get capitalizeFirstofEach => this.split(" ").map((str) => str.capitalize).join(" ");
}

Використання:

final helloWorld = 'hello world'.inCaps; // 'Hello world'
final helloWorld = 'hello world'.allInCaps; // 'HELLO WORLD'
final helloWorld = 'hello world'.capitalizeFirstofEach; // 'Hello World'

Стара відповідь:

main() {
  String s = 'this is a string';
  print('${s[0].toUpperCase()}${s.substring(1)}');
}

7
буде скаржитися, коли рядок порожній або недостатньо довгий.
Rishi Dua

16
@RishiDua, а також розробник (за замовчуванням) ми несемо відповідальність перевірити ці умови 🐱‍👤
Jawand Singh,

12
str.capitalizeце не визначене . Отже, ви використовуєтеstr.inCaps
Ашан

50
void main() {
  print(capitalize("this is a string"));
  // displays "This is a string"
}

String capitalize(String s) => s[0].toUpperCase() + s.substring(1);

Дивіться цей фрагмент, що працює на DartPad: https://dartpad.dartlang.org/c8ffb8995abe259e9643

Крім того, ви можете використовувати пакет рядків , див. Великі літери .


3
s[0].toUpperCase() + s.substring(1).toLowerCase();у випадку, якщо для початку рядок має великі регістри.
TomTom101

45

Синтаксичний розбір підрядків в інших відповідях не враховує розбіжностей мови. Функція toBeginningOfSentenceCase () у intl/intl.dartпакеті обробляє основний регістр речень та пунктирне "i" турецькою та азербайджанською мовами.

import 'package:intl/intl.dart';
...
String sentence = toBeginningOfSentenceCase('this is a string'); // This is a string

1
Відповіддю на додаток до методу розширення має бути відповідь. Якщо ви вже використовуєте пакет intl, немає причин винаходити колесо з розширенням.
Густаво Родрігес

Саме те, що я шукав. Дякую!
jwehrle

15

Існує пакет utils, який охоплює цю функцію. У нього є ще кілька приємних методів роботи з рядками.

Встановіть його за допомогою:

dependencies:
  basic_utils: ^1.2.0

Використання:

String capitalized = StringUtils.capitalize("helloworld");

Github:

https://github.com/Ephenodrom/Dart-Basic-Utils


приємний пакет. Дякуємо за поділ
Дані

7

Ви можете використовувати цей пакет у flutter ReCase. Він надає вам різні функції перетворення регістрів, такі як:

  • змія_справа
  • крапка
  • шлях / випадок
  • param-case
  • PascalCase
  • Заголовок-футляр
  • Титульний регістр
  • camelCase
  • Відмінок вироку
  • CONSTANT_CASE

    ReCase sample = new ReCase('hello world');
    
    print(sample.sentenceCase); // Prints 'Hello world'
    

Чудова бібліотека !!
Даріо Брукс

4

Щоб перевірити наявність нульових і порожніх випадків рядків, також використовуючи короткі позначення:

  String capitalizeFirstLetter(String s) =>
  (s?.isNotEmpty ?? false) ? '${s[0].toUpperCase()}${s.substring(1)}' : s;

Я не думаю, що це перевіряє null.
Giraldi

4
String capitalize(String s) => (s != null && s.length > 1)
    ? s[0].toUpperCase() + s.substring(1)
    : s != null ? s.toUpperCase() : null;

Він проходить тести:

test('null input', () {
  expect(capitalize(null), null);
});
test('empty input', () {
  expect(capitalize(''), '');
});
test('single char input', () {
  expect(capitalize('a'), 'A');
});
test('crazy input', () {
  expect(capitalize('?a!'), '?a!');
});
test('normal input', () {
  expect(capitalize('take it easy bro!'), 'Take it easy bro!');
});

4
void allWordsCapitilize (String str) {
    return str.toLowerCase().split(' ').map((word) {
      String leftText = (word.length > 1) ? word.substring(1, word.length) : '';
      return word[0].toUpperCase() + leftText;
    }).join(' ');
}
allWordsCapitilize('THIS IS A TEST'); //This Is A Test

Незважаючи на те, що це може дати відповідь на запитання, ви повинні додати більше приміток для пояснення, щоб допомогти ОП дізнатися причину.
Фонг

3

Також слід перевірити, чи рядок є нульовим чи порожнім.

String capitalize(String input) {
  if (input == null) {
    throw new ArgumentError("string: $input");
  }
  if (input.length == 0) {
    return input;
  }
  return input[0].toUpperCase() + input.substring(1);
}

3

Як згадувалося раніше Ephenodrom, ви можете додати пакет basic_utils у свій pubspeck.yaml і використовувати його у файлах дротиків, як це:

StringUtils.capitalize("yourString");

Це прийнятно для однієї функції, але при більшому ланцюжку операцій стає незручно.

Як пояснюється в мовній документації Dart :

doMyOtherStuff(doMyStuff(something.doStuff()).doOtherStuff())

Цей код набагато менш читабельний, ніж:

something.doStuff().doMyStuff().doOtherStuff().doMyOtherStuff()

Код також є набагато менш відкритим, оскільки середовище розробки може запропонувати doMyStuff () після something.doStuff ()., Але навряд чи запропонує розміщувати doMyOtherStuff (...) навколо виразу.

З цих причин, я думаю, вам слід додати метод розширення до типу String (ви можете це зробити з dart 2.6!) Таким чином:

/// Example : hello => Hello, WORLD => World
extension Capitalized on String {
  String capitalized() => this.substring(0, 1).toUpperCase() + this.substring(1).toLowerCase();
}```

and call it using dot notation:

`'yourString'.capitalized()`

or, if your value can be null, replacing the dot with a '?.' in the invocation:

`myObject.property?.toString()?.capitalized()`


3

Ви можете скористатися методом capitalize () бібліотеки рядків, він тепер доступний у версії 0.1.2 і переконайтеся, що додаєте залежність у pubspec.yaml:

dependencies:
  strings: ^0.1.2

та імпортуйте його у файл дротиків:

import 'package:strings/strings.dart';

і тепер ви можете використовувати метод, який має такий прототип:

String capitalize(String string)

Приклад:

print(capitalize("mark")); => Mark 


2

Це ще одна альтернатива використання великих літер у рядках дротиків за допомогою методу класу String splitMapJoin:

var str = 'this is a test';
str = str.splitMapJoin(RegExp(r'\w+'),onMatch: (m)=> '${m.group(0)}'.substring(0,1).toUpperCase() +'${m.group(0)}'.substring(1).toLowerCase() ,onNonMatch: (n)=> ' ');
print(str);  // This Is A Test 

1
хороше рішення, але не працює з літерами з діакритикою
Палехандро

це нормально через регулярний вираз, якщо ви хочете це зробити, відрегулюйте регулярний вираз для включення цих літер
Ндіма,

2

Дивно, але це не доступно в дротиках для початку. Нижче наведено розширення для написання великих літер String:

extension StringExtension on String {
  String capitalized() {
    if (this.isEmpty) return this;
    return this[0].toUpperCase() + this.substring(1);
  }
}

Він перевіряє, що для початку Stringне є порожнім, тоді він просто пише велику літеру з першої літери та додає решту

Використання:

import "path/to/extension/string_extension_file_name.dart";

var capitalizedString = '${'alexander'.capitalized()} ${'hamilton, my name is'.capitalized()} ${'alexander'.capitalized()} ${'hamilton'.capitalized()}');
// Print result: "Alexander Hamilton, my name is Alexander Hamilton"


1

Деякі з найбільш популярних інших відповідей, здається, не обробляють nullі ''. Я вважаю за краще не мати справу з цими ситуаціями в клієнтському коді, я просто хочу Stringвзамін, незважаючи ні на що - навіть якщо це означає порожній у випадку null.

String upperCaseFirst(String s) => (s??'').length<1 ? '' : s[0].toUpperCase() + s.substring(1)


1

Найпростіша відповідь тут:

Спочатку зробіть першу літеру рядка великою, використовуючи її індекс, а потім зберіть решту рядка.

Тут ім'я користувача - це рядок.

ім'я користувача [0] .toUpperCase () + username.substring (1);


0
String fullNameString =
    txtControllerName.value.text.trim().substring(0, 1).toUpperCase() +
        txtControllerName.value.text.trim().substring(1).toLowerCase();

Відповіді лише на код не рекомендується використовувати в Stack Overflow, оскільки вони не пояснюють, як це вирішує проблему. Будь ласка, відредагуйте свою відповідь, щоб пояснити, що робить код і як він відповідає на питання, щоб він був корисним для інших користувачів, а також для OP.
FluffyKitten

0

Ось моя відповідь із використанням методів dart String.

String name = "big";
String getFirstLetter = name.substring(0, 1);    
String capitalizedFirstLetter =
      name.replaceRange(0, 1, getFirstLetter.toUpperCase());  
print(capitalizedFirstLetter);

0

Цим ділюсь з моєю відповіддю

void main() {
  var data = allWordsCapitilize(" hi ram good day");
  print(data);
}

String allWordsCapitilize(String value) {
  var result = value[0].toUpperCase();
  for (int i = 1; i < value.length; i++) {
    if (value[i - 1] == " ") {
      result = result + value[i].toUpperCase();
    } else {
      result = result + value[i];
    }
  }
  return result;
}

0

Ще один нездоровий спосіб вирішення цього питання - це

String myName = "shahzad";

print(myName.substring(0,1).toUpperCase() + myName.substring(1));

це дасть той самий ефект, але це досить брудний спосіб зробити це.


0

Я використовувала відповідь Ханни Старк, але вона виводить програму з ладу, якщо рядок порожній, тому ось вдосконалена версія рішення з розширенням:

extension StringExtension on String {
  String capitalize() {
    if(this.length > 0) {
      return "${this[0].toUpperCase()}${this.substring(1)}";
    }
    return "";
  }
}

0

Використовуйте символи, а не кодові одиниці

Як описано в статті Маніпуляції зі стрілками Dart зроблено правильно (див. Сценарій 4), кожного разу, коли ви маєте справу з введенням користувача, вам слід використовувати charactersзамість індексу.

// import 'package:characters/characters.dart';

final sentence = 'e\u0301tienne is eating.'; // étienne is eating.
final firstCharacter = sentence.characters.first.toUpperCase();
final otherCharacters = sentence.characters.skip(1);
final capitalized = '$firstCharacter$otherCharacters';
print(capitalized); // Étienne is eating.

У цьому конкретному прикладі це все одно буде працювати, навіть якщо ви використовували індекс, але все-таки є гарною ідеєю увійти в звичку використовувати characters.

Пакет символів поставляється з Flutter, тому немає необхідності в імпорті. У чистому проекті Dart вам потрібно додати імпорт, але вам не потрібно нічого додавати до pubspec.yaml.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.