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


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.