Как сделать первую букву строки в дротике заглавной?

Как сделать первый символ строки заглавной, не меняя регистр других букв?

Например, «это строка» должно отображаться «Это строка».


person Kasper    schedule 14.04.2015    source источник


Ответы (28)


Начиная с версии 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();
person Hannah Stark    schedule 04.03.2020
comment
Расширение должно вернуть return "${this[0].toUpperCase()}${this.substring(1).toLowerCase()}";. В противном случае он будет правильно использовать заглавные буквы «это», но не «ЭТО». - person Luciano Rodríguez; 21.05.2020
comment
Разве вы обычно не проверяете, действительно ли значение, прежде чем работать с ним? - person Hannah Stark; 03.07.2020
comment
Мы должны либо проверить isEmpty внутри capitalize (), либо оставить это на усмотрение вызывающей стороны. Я предпочитаю вызывающего, поэтому код не нужно засорять проверками .isEmpty (). Вы можете добавить if (isEmpty) return this в качестве первой строки. - person Venkat D.; 12.08.2020
comment
должен проверить, пусто ли это, чтобы избежать сбоя. Я не думаю, что toLowerCase () выйдет из строя с пустой строкой, и ваше расширение также не должно - person Lucas Chwe; 13.08.2020
comment
вы должны добавить несколько проверок, если строка не равна нулю - например: if (this == null || this == "") return ""; - person Maciej; 17.11.2020

Скопируйте это где-нибудь:

extension CapExtension on String {
  String get inCaps => this.length > 0 ?'${this[0].toUpperCase()}${this.substring(1)}':'';
  String get allInCaps => this.toUpperCase();
  String get capitalizeFirstofEach => this.replaceAll(RegExp(' +'), ' ').split(" ").map((str) => str.inCaps).join(" ");
}

Использование:

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

Старый ответ:

main() {
  String s = 'this is a string';
  print('${s[0].toUpperCase()}${s.substring(1)}');
}
person Günter Zöchbauer    schedule 14.04.2015
comment
будет жаловаться, если строка пуста или недостаточно длинна. - person Rishi Dua; 12.07.2017
comment
@RishiDua также как разработчик (по умолчанию) мы обязаны проверить эти условия ????‍???? - person Jawand Singh; 26.03.2019
comment
str.capitalize не определено. Итак, вы используете str.inCaps - person Ashan; 17.09.2020

Разбор подстроки в других ответах не учитывает различия языковых стандартов. Функция toBeginningOfSentenceCase () в пакете intl/intl.dart обрабатывает базовый регистр предложений и пунктирная буква «i» в турецком и азербайджанском языках.

import 'package:intl/intl.dart';
...
String sentence = toBeginningOfSentenceCase('this is a string'); // This is a string
person Jenn    schedule 10.05.2019
comment
Это, в дополнение к ответу метода расширения, должно быть ответом. Если вы уже используете пакет intl, нет причин изобретать велосипед с расширением. - person Gustavo Rodrigues; 20.11.2020
comment
Именно то, что я искал. Спасибо! - person jwehrle; 02.12.2020

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

В качестве альтернативы вы можете использовать пакет строк, см. использовать заглавные буквы.

person Alexandre Ardhuin    schedule 14.04.2015
comment
s[0].toUpperCase() + s.substring(1).toLowerCase(); в случае, если строка начинается с верхнего регистра. - person TomTom101; 25.01.2020

Есть пакет утилит, который охватывает эту функцию. В нем есть еще несколько хороших методов для работы со строками.

Установите его с помощью:

dependencies:
  basic_utils: ^1.2.0

Использование :

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

Github:

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

person Ephenodrom    schedule 19.06.2019
comment
хороший пакет. Спасибо, что поделился - person Dani; 19.12.2019

Вы можете использовать этот пакет во флаттере ReCase. Он предоставляет вам различные функции преобразования регистра, например:

  • snake_case
  • dot.case
  • путь / дело
  • param-case
  • PascalCase
  • Заголовок-Дело
  • Название дела
  • верблюд
  • Приговор
  • CONSTANT_CASE

    ReCase sample = new ReCase('hello world');
    
    print(sample.sentenceCase); // Prints 'Hello world'
    
person Mahi    schedule 24.03.2020
comment
Отличная библиотека !! - person Dario Brux; 05.01.2021
comment
Выглядит отлично. Используйте с осторожностью, поскольку есть только один тест, как бы вы ни копали тестовый пример. String mockText = 'This is-Some_sampleText. YouDig?'; - person WillHaslett; 24.02.2021

Чтобы проверить наличие пустых и пустых строк, также используя короткие обозначения:

  String capitalizeFirstLetter(String s) =>
  (s?.isNotEmpty ?? false) ? '${s[0].toUpperCase()}${s.substring(1)}' : s;
person E. Sun    schedule 03.12.2018
comment
Я не думаю, что это проверяет null. - person Giraldi; 12.12.2018

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!');
});
person Andrew    schedule 01.10.2019

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

dependencies:
  strings: ^0.1.2

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

import 'package:strings/strings.dart';

и теперь вы можете использовать метод, имеющий следующий прототип:

String capitalize(String string)

Пример :

print(capitalize("mark")); => Mark 
person mohcine rouessi    schedule 27.05.2020

Вы также должны проверить, является ли строка пустой или пустой.

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);
}
person Rishi Dua    schedule 12.07.2017

Как упоминалось ранее Ephenodrom, вы можете добавить пакет basic_utils в свой pubspeck.yaml и использовать его в своих файлах dart следующим образом:

StringUtils.capitalize("yourString");

Это приемлемо для одной функции, но в более крупной цепочке операций становится неудобно.

Как объясняется в Документация по языку Dart:

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

Этот код гораздо менее читабелен, чем:

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

Код также намного труднее обнаружить, потому что IDE может предложить 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()`

person Marco Bottaro    schedule 09.03.2020

Странно, что в дротике этого нет. Ниже приведено расширение для использования 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"
person Lucas Chwe    schedule 13.08.2020

Этот код у меня работает.

String name = 'amina';    

print(${name[0].toUpperCase()}${name.substring(1).toLowerCase()});
person Amina Bekir    schedule 30.03.2020

Это еще одна альтернатива заглавным буквам Strings in dart с использованием String class Method _ 1_:

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 
person Ndimah    schedule 27.05.2020
comment
хорошее решение, но не работает с буквами с диакритическими знаками - person Palejandro; 05.08.2020
comment
это нормально из-за регулярного выражения, если вы хотите это сделать, настройте регулярное выражение, чтобы включить эти буквы - person Ndimah; 06.08.2020

По состоянию на 23.03.2021 Flutter 2.0.2

Просто используйте yourtext.capitalizeFirst

person Jing Wey    schedule 23.03.2021
comment
Я не могу найти на это ссылки. Вы можете предоставить источник? - person Tom; 09.05.2021
comment
Извините, это под плагином, у меня плохо. Используйте эту: ссылку. В нем много полезных утилит - person Jing Wey; 11.05.2021

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

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

Вы можете использовать пакет Text_Tools, простой в использовании:

https://pub.dev/packages/text_tools

Ваш код будет таким:

//This will print 'This is a string
print(TextTools.toUppercaseFirstLetter(text: 'this is a string'));
person Edivaldo Marco    schedule 12.10.2020

Самый простой ответ здесь:

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

Здесь имя пользователя - это строка.

имя пользователя [0] .toUpperCase () + имя пользователя.substring (1);

person SWAG Assassin YT    schedule 27.10.2020

Я использовал ответ Ханны Старк, но он приводит к сбою приложения, если строка пуста, поэтому вот улучшенная версия решения с расширением:

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

Используйте символы, а не кодовые единицы

Как описано в статье, Манипуляции со строкой 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.

Пакет characters поставляется с Flutter, поэтому импорт не требуется. В чистом проекте Dart вам нужно добавить импорт, но вам не нужно ничего добавлять в pubspec.yaml.

person Suragch    schedule 25.12.2020
comment
Привет! Спасибо за ответ. Мне любопытно, в чем будет польза от characters? - person Iván Yoed; 26.05.2021

Вот мой ответ с использованием методов dart String.

String name = "big";
String getFirstLetter = name.substring(0, 1);    
String capitalizedFirstLetter =
      name.replaceRange(0, 1, getFirstLetter.toUpperCase());  
print(capitalizedFirstLetter);
person David B.    schedule 13.09.2020

Настоящим делюсь своим ответом

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;
}
person ramkumar    schedule 20.09.2020

Еще один нездоровый способ решения этой проблемы, который я нашел, - это

String myName = "shahzad";

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

это даст тот же эффект, но это довольно грязный способ сделать это.

person Shahzad Umar Baig    schedule 20.11.2020

Я использовал другую реализацию:

  1. Создайте класс:
import 'package:flutter/services.dart';

class FirstLetterTextFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    return TextEditingValue(
      //text: newValue.text?.toUpperCase(),
      text: normaliseName(newValue.text),
      selection: newValue.selection,
    );
  }

  /// Fixes name cases; Capitalizes Each Word.
  String normaliseName(String name) {
    final stringBuffer = StringBuffer();

    var capitalizeNext = true;
    for (final letter in name.toLowerCase().codeUnits) {
      // UTF-16: A-Z => 65-90, a-z => 97-122.
      if (capitalizeNext && letter >= 97 && letter <= 122) {
        stringBuffer.writeCharCode(letter - 32);
        capitalizeNext = false;
      } else {
        // UTF-16: 32 == space, 46 == period
        if (letter == 32 || letter == 46) capitalizeNext = true;
        stringBuffer.writeCharCode(letter);
      }
    }

    return stringBuffer.toString();
  }
}

Затем вы импортируете класс на любую нужную вам страницу, например, в свойстве inputFormatters TextField, просто вызовите виджет, указанный выше, следующим образом:


TextField(
inputformatters: [FirstLetterTextFormatter()]),
),

person Hez    schedule 24.03.2021

Вы можете использовать это:

extension EasyString on String {
  String toCapitalCase() {
   var lowerCased = this.toLowerCase();
   return lowerCased[0].toUpperCase() + lowerCased.substring(1);
 }
} 
person batuhankrbb    schedule 09.06.2021

Попробуйте использовать этот код для использования заглавной буквы в первой букве любой строки в Dart - Flutter

Example: hiii how are you

    Code:
     String str="hiii how are you";
     Text( '${str[0].toUpperCase()}${str.substring(1)}',)`

Output: Hiii how are you
person Rahul Raj    schedule 21.05.2021

person    schedule
comment
Хотя это может дать ответ на вопрос, вам следует добавить дополнительное примечание для объяснения, чтобы помочь OP узнать причину. - person Nguyễn Văn Phong; 15.01.2020

person    schedule
comment
Ответы только на код не приветствуются в Stack Overflow, потому что они не объясняют, как это решает проблему. Измените свой ответ, чтобы объяснить, что делает код и как он отвечает на вопрос, чтобы он был полезен и другим пользователям, а также OP. - person FluffyKitten; 02.08.2020