266

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

例如,“this is a string”应该给出“this is a strin”。

46个答案46

重置为默认值
375

自从dart版本2.6以来,dart支持扩展:

字符串上的扩展名StringExtension{字符串大写(){return“${this[0].toUpperCase()}${this.substring(1).toLowerCase(;}}

所以你可以这样打电话给分机:

导入“string_extension.dart”;var someCapitalizedString=“someString”.capitalie();
8
  • 23
    扩展应返回return“${this[0].toUpperCase()}${this.substring(1).toLowerCase(;。如果不是,它将正确地大写“this”,而不是“this”。 评论 2020年5月21日17:53
  • 5
    在使用某个值进行操作之前,您通常不检查它是否有效吗? 评论 2020年7月3日10:09
  • 2
    我们要么在capitalie()中检查isEmpty,要么由调用方决定。我更喜欢调用程序,这样代码就不需要到处都是.isEmpty()检查。您可以添加如果(isEmpty)返回此作为第一行。 评论 2020年8月11日23:34
  • 7
    如果字符串不为null,则应添加一些检查-例如:if(this==null|this==“”)返回“”;
    – 马西耶
    评论 2020年11月17日7:39
  • 4
    我以为我喜欢飞镖。。。。但这很特别。为什么他们在核心语言中没有这样的东西?我想知道还缺什么!
    – 格里
    评论 2021年8月1日10:27
305

将此复制到以下位置:

字符串上的扩展字符串套管扩展{字符串get to Capitalized=>length>0?'${this[0].toUpperCase()}${substring(1).toLowerCase()}':“”;字符串get-toTitleCase=>replaceAll(RegExp('+'),'').split('').map((str)=>str.toCapitalized).join('');}

用法:

//导入StringCasingExtensionfinal helloWorld='hello world'.toCapitalized;//'你好世界'final helloWorld='hello world'.toUpperCase();//'你好,世界final helloWorldCap='hello world'.toTitleCase;//'你好世界'
5
  • 8
    当字符串为空或不够长时,将发出抱怨。 评论 2017年7月11日23:58
  • 21
    @RishiDua以及开发人员(默认情况下),我们有责任检查这些条件🐱‍👤 评论 2019年3月26日11:35
  • 22
    住院治疗未定义。所以您使用str.inCaps格式
    – 刘国旭
    评论 2020年9月17日16:17
  • 未捕获错误:RangeError(index):索引超出范围:没有有效的索引:0
    – BIS技术
    评论 2021年4月12日8:36
  • 1
    final helloWorld='hello world'.capitalieFirstofEach;
    – BIS技术
    评论 2021年4月12日8:36
200

其他答案中的子字符串解析不考虑地区差异。这个到句子开头()中的函数国际/国际省道package处理土耳其语和阿塞拜疆语中的基本句子-外壳和虚线“i”。

将“package:intl/intl.dart”show导入BeginningOfSentenceCase;print(toBeginningOfSentenceCase('这是一个字符串');

结果:
这是一根绳子

5
  • 11
    这个加上扩展方法的答案应该是正确的。如果您已经使用了intl包,那么没有理由使用扩展来重新设计轮子。 评论 2020年11月20日16:25
  • 是的,如果你想以正确的方式处理不同的地区,这是正确的答案+1 评论 2021年8月13日6:49
  • 2
    @GustavoRodrigues-即使您目前没有使用Intl,这也是一个更好的答案,因为这个包由Flutter/Dat团队维护,而扩展方法必须由开发人员维护。 评论 2021年12月31日0:47
  • 这是一个扩展。为什么需要维护? 评论 2022年7月30日1:27
  • 目前,这并没有实现任何特定于本地的逻辑(只是将第一个字母大写,专门处理土耳其语i)。但未来可能会扩大。
    – rjh公司
    评论 2022年8月28日11:20
82
空main(){打印(大写(“这是一个字符串”);//显示“This is a string”(这是一个字符串)}字符串大写(字符串s)=>s[0].toUpperCase()+s.substring(1);

请参阅DartPad上运行的以下代码段:https://dartpad.dartlang.org/c8ffb8995abe259e9643

1
  • 8
    s[0].toUpperCase()+s.substring(1).toLowerCase(;如果字符串都是大写的。
    – 汤姆101
    评论 2020年1月25日13:28
22

有一个utils包涵盖了此功能。它有一些更好的字符串操作方法。

使用以下工具安装:

依赖项:basic_utils:^1.2.0

用法:

字符串大写=StringUtils.capitalize(“helloworld”);

github:

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

1
  • 包装精美。感谢分享
    – 丹尼
    评论 2019年12月19日11:55
22

太晚了,但我用了,

String title=“一些没有首字母大写的字符串”;title=title.replaceFirst(title[0],title[0].toUpperCase());//一些没有……的字符串。。。
16

你可以在颤抖中使用这个包重新设置案例它为您提供了各种案例转换功能,如:

  • 蛇形外壳
  • 点.案例
  • 路径/案例
  • param-case系列
  • 帕斯卡命名法
  • 页眉-案例
  • 标题大小写
  • 骆驼皮箱
  • 句子大小写
  • 常量(_C)

    ReCase示例=新ReCase(“hello world”);打印(sample.sentenceCase);//打印“Hello world”
2
  • 很棒的图书馆!! 评论 2021年1月5日16:15
  • 2
    看起来很棒。请谨慎使用,因为只有一个测试,无论您对测试用例有多深入。String mockText='这是Some_sampleText。YouDig?”; 评论 2021年2月23日23:51
8
void allWordsCapilize(字符串字符串){return str.toLowerCase().split(“”).map((字){字符串leftText=(word.length>1)?word.substring(1,word.length):“”;返回字[0].toUpperCase()+leftText;}).join(“”);}allWordsCapilize(“这是一个测试”)//这是一个测试
  • 虽然这可能回答了问题,但您应该添加更多注释进行解释,以帮助OP了解原因。
    – 阮文峰
    评论 2020年1月15日2:05
  • 未捕获错误:RangeError(index):索引超出范围:没有有效的索引:0
    – BIS技术
    评论 2021年4月12日8:40
  • 字符串数据=allWordsCapilize(“这是一个测试”);
    – BIS技术
    评论 2021年4月12日8:40
8

正如Ephenodrom之前提到的,您可以在pubspeck.yaml中添加basic_utils包,并在dart文件中使用它,如下所示:

StringUtils.capitalie(“yourString”);

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

如中所述Dart语言文档:

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

那密码太多了可读性较差比:

某物.doStuff().doMyStuff().doOtherStuff

代码也很多发现较少因为IDE可以建议doMyStuff()之后something.doStuff(),但不太可能建议doMyOtherStuff(…)围绕表达式。

基于这些原因,我认为您应该向String类型添加一个扩展方法(您可以从dart 2.6开始!),如下所示:

///将给定字符串大写[s]///示例:hello=>hello,WORLD=>WORLD字符串上大写的扩展名{字符串大写()=>this.substring(0,1).toUpperCase()+this.substring(1).to LowerCase(;}

并使用点表示法进行调用:

“yourString”大写()

或者,如果值可以为null,则将点替换为“?”在调用中:

myObject.property?。toString()?。大写()
8

如果您使用get:^4.6.5作为带有flutter的状态管理,则有用于资本化的内置扩展

//这将大写每个单词的第一个字母print('hello world',大写);//你好,世界//这将大写句子的第一个字母print('hello world'.capitalieFirst);//你好,世界//这将删除句子中的所有空格print('hello world'.removeAllWhitespace);//你好世界//这将把字符串转换为lowerCalelCaseprint(“这是新世界”,camelCase);//这是新世界//这将删除两个单词之间的所有空格,并将其替换为“-”print(“这是新世界”.paramCase);//这个我是新世界
5
字符串大写(字符串s)=>(s!=null&&s.length>1)? s[0].toUpperCase()+s.substring(1):s!=无效的?s.toUpperCase():空;

它通过了测试:

测试(“全部输入”,(){expect(大写(null),null);});测试('空输入',(){expect(大写(“”),“”);});测试(“单个字符输入”,(){expect(大写('a'),'a');});测试('疯狂输入',(){expect(大写(‘?a!’),‘?a!');});测试('正常输入',(){expect(大写('take it easy bro!'),'take it's easy bra!');});
0
5
字符串?to大写(字符串?输入){if(input==null||input.isEmpty)返回输入;return“${input[0].toUpperCase()}${input.substring(1).toLowerBase()}”;}

或扩展名:

扩展字符串字符串上的扩展{字符串?到大写(){if(this==null||this.isEmpty)返回这个;return“${this[0].toUpperCase()}${this.substring(1).toLowerCase(;}}
4

要检查null和空字符串大小写,也要使用短符号:

字符串大写首字母(字符串s)=>(s?.isNotEmpty??false)?”${s[0].toUpperCase()}${s.substring(1)}':s;
1
  • 我认为这不符合无效的. 评论 2018年12月12日8:07
4

您可以使用字符串库的capitalie()方法,它现在在0.1.2版本中可用,并确保在pubspec.yaml中添加dependencie:

依赖项:字符串:^0.1.2

并将其导入dart文件:

导入“package:strings/strings.dart”;

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

字符串大写(字符串)

例子:

打印(大写(“标记”);=>作记号

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

字符串大写(字符串输入){if(输入==空){throw new ArgumentError(“string:$input”);}if(输入长度==0){返回输入;}return input[0].toUpperCase()+input.substring(1);}

这是使用String类Method在dart中大写String的另一种替代方法拆分映射联接:

var str='这是一个测试';str=str.splitMapJoin(RegExp(r“\w+”),onMatch:(m)=>“${m.group(0)}”.substring(0,1).toUpperCase()+“${m.group(O)}“.substring:;打印(str);//这是一个测试
4
  • 1
    很好的解决方案,但不适用于带变音符号的字母 评论 2020年8月5日18:36
  • 这是正常的,因为正则表达式,如果您希望这样做,请调整正则表达式以包含这些字母
    – 恩迪玛
    评论 2020年8月6日20:43
  • 我认为更简单的实现是处理空白,而不是正则表达式中的单词,只需使用str=str.trim().splitMapJoin(RegExp(r“\s+”),onMatch:(m)=>“”,onNonMatch:(n){return“${n.substring(0,1).toUpperCase()}${n.substring(1).toLowerBase()}';},)。trim();
    – 恩迪玛
    评论 2021年10月11日15:46
  • 最佳解决方案
    – 本顿
    评论 2022年1月14日7:34

奇怪的是,这在飞镖中是不可用的。下面是大写a的扩展字符串:

字符串上的扩展名StringExtension{字符串大写(){如果(this.isEmpty)返回此;return this[0].toUpperCase()+this.substring(1);}}

它检查字符串开头不为空,然后它只将第一个字母大写并添加其余字母

用法:

导入“path/to/extension/string_extension_file_name.dart”;var capitalizedString='${'alexander'.capitalized(;//打印结果:“Alexander Hamilton,我叫Alexander Hamilton”

使用字符而不是代码单位

如文章所述飞镖串操作正确(请参见场景4),无论何时处理用户输入,都应该使用字符而不是索引。

//导入“package:characters/characters.dart”;最后一句=“e\u0301tienne正在吃。”;//eétienne正在吃东西。final firstCharacter=句子.characters.first.toUpperCase();final otherCharacters=句子.characters.skip(1);最终大写=“$firstCharacter$otherCharacters”;打印(大写);//Étienne正在吃东西。

在这个特定的示例中,即使您使用索引,它仍然可以工作,但养成使用索引的习惯仍然是一个好主意字符.

这个字符软件包附带Flutter,因此无需导入。在纯Dart项目中,您需要添加导入,但不必向pubspec.yaml添加任何内容。

1
  • 嘿!感谢您的回复。我很好奇字符? 评论 2021年5月26日17:47
字符串上的扩展名StringExtension{字符串大写(){把这个还给我.to下壳体().split(“”).map((word)=>单词[0].toUpperCase()+单词.substring(1,word.length)).加入(“”);}}

对于任何感兴趣的人来说,这应该适用于任何字符串

在检查的范围内。
Dart的成语>2.16.1

作为一项功能

字符串大写(String str)=>str.is非空? str[0].toUpperCase()+str.substring(1):str;

作为扩展

字符串上的扩展名StringExtension{字符串获取大写=>不是空的? this[0].toUpperCase()+子字符串(1):此;}
var original=“这是一个字符串”;var changed=original.substring(0,1).toUpperCase()+original.substring;

如果Dart版本为2.12或更高版本,则解决此问题的简单有效的方法之一是:,

扩展名字符串大写{字符串大写{if(isEmpty)返回“”;return replaceFirst(this[0],this[0].toUpperCase());}}

编写延伸字符串类确保代码的可重用性和干净的语法,您可以这样使用扩展,

String yourString='这是一个字符串';final String capitalizedString=yourString.capitalized//这是一根绳子
2

这个代码对我很有用。

字符串名称='amina';打印(${name[0].toUpperCase()}${name.substring(1).toLowerCase(()});
2

最简单的答案是:

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

这里用户名是字符串。

用户名[0].toUpperCase()+用户名.substring(1);

2

您可以使用此功能:

字符串大写(String str){返回str.split(“”).map((word)=>word.substring(0,1).toUpperCase()+word.substring(1)).join(“”);}
2

简单,无任何扩展:

title=“一些没有首字母的标题”title.replaceRange(0,1,title[0].toUpperCase())//结果:“某些标题没有首字母”
1

一些更受欢迎的其他答案似乎无法处理无效的''。我宁愿不必在客户端代码中处理这些情况,我只需要一个字符串作为回报,无论发生什么,即使这意味着在无效的.

字符串upperCaseFirst(字符串s)=>(s??'')。长度<1?'':s[0].toUpperCase()+s.substring(1)
1

您可以使用Text_Tools包,使用起来很简单:

https://pub.dev/packages/text_tools网站

您的代码如下:

//这将打印“这是一个字符串print(TextTools.toUppercaseFirstLetter(text:'这是一个字符串'));
1

我发现解决这个问题的另一种不健康的方法是

字符串myName=“shahzad”;打印(myName.substring(0,1).toUpperCase()+myName.substring(1));

这将产生同样的效果,但这是一种相当肮脏的方式。

1

我使用了Hannah Stark的答案,但如果字符串为空,它会使应用程序崩溃,所以这里是带扩展的解决方案的改进版本:

字符串上的扩展名StringExtension{字符串大写(){如果(this.length>0){return“${this[0].toUpperCase()}${this.substring(1)}”;}返回“”;}}

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.