如何在飞镖中将字符串的第一个字母大写?
Posted
技术标签:
【中文标题】如何在飞镖中将字符串的第一个字母大写?【英文标题】:How to capitalize the first letter of a string in dart? 【发布时间】:2015-06-20 03:50:52 【问题描述】:如何将字符串的第一个字符大写,同时不改变任何其他字母的大小写?
例如,“这是一个字符串”应该给出“这是一个字符串”。
【问题讨论】:
【参考方案1】:复制到某处:
extension StringCasingExtension on String
String toCapitalized() => length > 0 ?'$this[0].toUpperCase()$substring(1).toLowerCase()':'';
String toTitleCase() => replaceAll(RegExp(' +'), ' ').split(' ').map((str) => str.toCapitalized()).join(' ');
用法:
// import StringCasingExtension
final helloWorld = 'hello world'.toCapitalized(); // 'Hello world'
final helloWorld = 'hello world'.toUpperCase(); // 'HELLO WORLD'
final helloWorldCap = 'hello world'.toTitleCase(); // 'Hello World'
【讨论】:
当字符串为空或不够长时会报错。 @RishiDua 作为开发人员,(默认情况下)我们有责任检查这些条件??str.capitalize
未定义。所以你使用str.inCaps
Uncaught Error: RangeError (index): Index out of range: no indices are valid: 0
final helloWorld = 'hello world'.capitalizeFirstofEach;
【参考方案2】:
void main()
print(capitalize("this is a string"));
// displays "This is a string"
String capitalize(String s) => s[0].toUpperCase() + s.substring(1);
查看在 DartPad 上运行的 sn-p:https://dartpad.dartlang.org/c8ffb8995abe259e9643
【讨论】:
s[0].toUpperCase() + s.substring(1).toLowerCase();
以防字符串全部大写。【参考方案3】:
var orig = "this is a string";
var changed = orig.substring(0, 1).toUpperCase + orig.substring(1)
【讨论】:
【参考方案4】:您还应该检查字符串是否为空或为空。
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);
【讨论】:
【参考方案5】:要检查 null 和空字符串情况,也可以使用短符号:
String capitalizeFirstLetter(String s) =>
(s?.isNotEmpty ?? false) ? '$s[0].toUpperCase()$s.substring(1)' : s;
【讨论】:
我认为这不会检查null
。【参考方案6】:
其他答案中的子字符串解析不考虑语言环境差异。
intl/intl.dart
包中的 toBeginningOfSentenceCase() 函数处理基本的句子大小写以及土耳其语和阿塞拜疆语中的点“i”。
import 'package:intl/intl.dart' show toBeginningOfSentenceCase;
print(toBeginningOfSentenceCase('this is a string'));
【讨论】:
这加上扩展方法答案应该是答案。如果您已经使用 intl 包,则没有理由重新发明带有扩展名的***。 正是我想要的。谢谢! 是的,如果您想以正确的方式处理不同的语言环境,这是正确的答案。 +1 @GustavoRodrigues - 即使你目前没有使用 Intl,这也是一个更好的答案,因为这个包由 Flutter / Dart 团队维护,而扩展方法必须由开发人员维护。 【参考方案7】:有一个 utils 包涵盖了这个功能。它有一些更好的字符串操作方法。
安装它:
dependencies:
basic_utils: ^1.2.0
用法:
String capitalized = StringUtils.capitalize("helloworld");
Github:
https://github.com/Ephenodrom/Dart-Basic-Utils
【讨论】:
不错的包。感谢分享【参考方案8】:其他一些更受欢迎的答案似乎无法处理null
和''
。我宁愿不必在客户端代码中处理这些情况,无论如何我只想要一个String
作为回报——即使在null
的情况下这意味着一个空的。
String upperCaseFirst(String s) => (s??'').length<1 ? '' : s[0].toUpperCase() + s.substring(1)
【讨论】:
【参考方案9】: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!');
);
【讨论】:
【参考方案10】: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 了解原因。Uncaught Error: RangeError (index): Index out of range: no indices are valid: 0
String data = allWordsCapitilize('THIS IS A TEST') ;
【参考方案11】:
从 dart 2.6 版本开始,dart 支持扩展:
extension StringExtension on String
String capitalize()
return "$this[0].toUpperCase()$this.substring(1).toLowerCase()";
所以你可以像这样调用你的扩展:
import "string_extension.dart";
var someCapitalizedString = "someString".capitalize();
【讨论】:
扩展应该返回return "$this[0].toUpperCase()$this.substring(1).toLowerCase()";
。如果不是,它将正确大写“this”而不是“THIS”。
你通常不会在操作之前检查一个值是否有效吗?
我们要么必须在 capitalize() 中检查 isEmpty,要么将其留给调用者。我的偏好是调用者,因此代码不需要乱扔 .isEmpty() 检查。您可以在第一行添加if (isEmpty) return this
。
如果字符串不为空,您应该添加一些检查 - 例如:if (this == null || this == "") return "";
我以为我喜欢 Dart.... 但这很特别。为什么他们在核心语言中没有这样的东西?我想知道还缺少什么!【参考方案12】:
正如 Ephenodrom 之前提到的, 您可以在 pubspeck.yaml 中添加 basic_utils 包,并在 dart 文件中使用它,如下所示:
StringUtils.capitalize("yourString");
这对于单个函数来说是可以接受的,但在更大的操作链中,它变得很尴尬。
如Dart language documentation中所述:
doMyOtherStuff(doMyStuff(something.doStuff()).doOtherStuff())
该代码比以下代码可读性差:
something.doStuff().doMyStuff().doOtherStuff().doMyOtherStuff()
代码也不易被发现,因为 IDE 可以在 something.doStuff()
之后建议 doMyStuff()
,但不太可能建议将 doMyOtherStuff(…)
放在表达式周围。
出于这些原因,我认为您应该为 String 类型添加一个扩展方法(从 dart 2.6 开始就可以这样做!),如下所示:
/// Capitalize the given string [s]
/// Example : hello => Hello, WORLD => World
extension Capitalized on String
String capitalized() => this.substring(0, 1).toUpperCase() + this.substring(1).toLowerCase();
并使用点符号来调用它:
'yourString'.capitalized()
或者,如果您的值可以为 null,则将点替换为 '?.'在调用中:
myObject.property?.toString()?.capitalized()
【讨论】:
【参考方案13】:你可以在flutter中使用这个包 ReCase 它为您提供各种大小写转换功能,例如:
snake_case dot.case 路径/案例 参数大小写 帕斯卡大小写 标题-大小写 标题案例 驼峰式 句子大小写CONSTANT_CASE
ReCase sample = new ReCase('hello world');
print(sample.sentenceCase); // Prints 'Hello world'
【讨论】:
很棒的图书馆!! 看起来不错。谨慎使用,因为只有一个测试,无论您如何挖掘测试用例。String mockText = 'This is-Some_sampleText. YouDig?';
【参考方案14】:
此代码对我有用。
String name = 'amina';
print($name[0].toUpperCase()$name.substring(1).toLowerCase());
【讨论】:
【参考方案15】:这是在 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
【讨论】:
很好的解决方案,但不适用于带有变音符号的字母 这是正常的,因为正则表达式,如果你想调整正则表达式以包含这些字母 我认为更简单的实现是处理空格,而不是正则表达式中的单词,只需将其更改为str = str.trim().splitMapJoin( RegExp(r'\s+'), onMatch: (m) => ' ', onNonMatch: (n) return '$n.substring(0,1).toUpperCase()$n.substring(1).toLowerCase()'; , ).trim();
【参考方案16】:
你可以使用字符串库的 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
【讨论】:
【参考方案17】:String fullNameString =
txtControllerName.value.text.trim().substring(0, 1).toUpperCase() +
txtControllerName.value.text.trim().substring(1).toLowerCase();
【讨论】:
在 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它如何解决问题。请编辑您的答案以解释代码的作用以及它如何回答问题,以便它对其他用户以及 OP 也有用。【参考方案18】:奇怪的是,这在 dart 中是不可用的。下面是一个将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"
【讨论】:
【参考方案19】:这是我使用 dart String 方法的答案。
String name = "big";
String getFirstLetter = name.substring(0, 1);
String capitalizedFirstLetter =
name.replaceRange(0, 1, getFirstLetter.toUpperCase());
print(capitalizedFirstLetter);
【讨论】:
【参考方案20】:特此分享我的答案
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;
【讨论】:
【参考方案21】:可以使用Text_Tools包,使用简单:
https://pub.dev/packages/text_tools
你的代码应该是这样的:
//This will print 'This is a string
print(TextTools.toUppercaseFirstLetter(text: 'this is a string'));
【讨论】:
【参考方案22】:最简单的答案在这里:
首先使用它的索引将字符串的第一个字母变为大写,然后连接字符串的其余部分。
这里的用户名是字符串。
用户名[0].toUpperCase() + 用户名.substring(1);
【讨论】:
【参考方案23】:我发现解决此问题的另一种不健康的方法是
String myName = "shahzad";
print(myName.substring(0,1).toUpperCase() + myName.substring(1));
这将产生相同的效果,但这样做很肮脏。
【讨论】:
【参考方案24】:我使用了 Hannah Stark 的答案,但如果字符串为空,它会使应用程序崩溃,所以这里是带有扩展名的解决方案的改进版本:
extension StringExtension on String
String capitalize()
if(this.length > 0)
return "$this[0].toUpperCase()$this.substring(1)";
return "";
【讨论】:
【参考方案25】:使用字符而不是代码单元
如文章Dart string manipulation done right(参见场景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 添加任何内容。
【讨论】:
嘿!感谢您的回复。我很好奇,characters
有什么好处?【参考方案26】:
截至 2021 年 3 月 23 日 Flutter 2.0.2
只需使用yourtext.capitalizeFirst
【讨论】:
我找不到对此的任何参考。可以提供来源吗? 对不起,它在插件下,我的错。使用这个:link。它有很多有用的实用程序【参考方案27】:我使用了不同的实现:
-
创建一个类:
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();
然后你将类导入你需要的任何页面,例如在 TextField 的 inputFormatters 属性中,只需像这样调用上面的小部件:
TextField(
inputformatters: [FirstLetterTextFormatter()]),
),
【讨论】:
【参考方案28】:尝试使用此代码将 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
【讨论】:
【参考方案29】:你可以用这个:
extension EasyString on String
String toCapitalCase()
var lowerCased = this.toLowerCase();
return lowerCased[0].toUpperCase() + lowerCased.substring(1);
【讨论】:
【参考方案30】:超级晚了,但我用,
String title = "some string with no first letter caps";
title = title.replaceFirst(title[0], title[0].toUpperCase()); // Some string with no...
【讨论】:
以上是关于如何在飞镖中将字符串的第一个字母大写?的主要内容,如果未能解决你的问题,请参考以下文章
如何在javaScript中将每个文本输入的第一个字母大写? [复制]