如何在dart中大写字符串的首字母?


78

如何在不更改任何其他字母大小写的情况下大写字符串的第一个字符?

例如,“这是一个字符串”应为“这是一个字符串”。

Answers:


75

从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();

4
扩展应该返回return "${this[0].toUpperCase()}${this.substring(1).toLowerCase()}";。如果不是,它将正确地大写“ this”而不是“ THIS”。
LucianoRodríguez

3
通常,在操作该值之前,您通常不会检查该值是否有效吗?
汉娜·史塔克

我们要么必须在capitalize()中检查isEmpty,要么将其留给调用方。我的偏爱是针对调用者的,因此该代码不需要被.isEmpty()检查所困扰。您可以添加if (isEmpty) return this为第一行。
Venkat D.

必须检查它是否为空以避免崩溃。我认为toLowerCase()不会因空字符串而崩溃,您的扩展也不应该
Lucas Chwe

83

将此复制到某处:

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,

6
str.capitalize没有定义。所以您使用str.inCaps
Ashan

不适用于我
Sam Ramezanli

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

42

其他答案中的子字符串分析不考虑区域差异。程序包中的toBeginningOfSentenceCase()函数intl/intl.dart处理基本的句子大小写以及土耳其语和阿塞拜疆语中带点划线的“ i”。

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


6

您可以在flutter ReCase中使用此程序包。 它为您提供了各种大小写转换功能,例如:

  • snake_case
  • 点格
  • 路径/案例
  • 案例
  • PascalCase
  • 标题大小写
  • 标题案例
  • 骆驼香烟盒
  • 句子大小写
  • 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

尽管这可能会回答问题,但是您应该添加更多注释来解释,以帮助OP知道原因。

3

您还应该检查字符串是否为null或为空。

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之前所述,您可以在pubspeck.yaml中添加basic_utils包,并在dart文件中使用它,如下所示:

StringUtils.capitalize("yourString");

这对于单个功能是可以接受的,但是在更大的操作链中,它变得很尴尬。

Dart语言文档中所述

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

该代码的可读性低于

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

由于IDE可以在something.doStuff()之后建议doMyStuff(),但也不太可能建议在表达式周围放置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()`



2

这是使用String类Method在dart中大写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
好的解决方案,但不适用于带有变音符号的字母
Palejandro

这是正常的,因为如果要使用正则表达式,请调整正则表达式以包含这些字母
Ndimah

2

您可以使用字符串librarie的capitalize()方法,现在在0.1.2版本中可用,并确保在pubspec.yaml中添加依赖项:

dependencies:
  strings: ^0.1.2

并将其导入到dart文件中:

import 'package:strings/strings.dart';

现在您可以使用具有以下原型的方法:

String capitalize(String string)

范例:

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

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

最简单的答案是在这里:

首先使用其索引使字符串的第一个字母变为大写,然后将字符串的其余部分连接起来。

这里的用户名是字符串。

username [0] .toUpperCase()+ username.substring(1);


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

不鼓励在堆栈溢出上使用仅代码的答案,因为它们没有解释它如何解决问题。请编辑您的答案以解释代码的作用以及它如何回答问题,以便它对于其他用户以及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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.