【问题标题】:How to capitalize the first letter of a string in dart?如何在飞镖中将字符串的第一个字母大写?
【发布时间】:2015-06-20 03:50:52
【问题描述】:

如何将字符串的第一个字符大写,同时不改变任何其他字母的大小写?

例如,“这是一个字符串”应该给出“这是一个字符串”。

【问题讨论】:

    标签: string flutter dart letter capitalize


    【解决方案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) =&gt; ' ', 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】:

                                我使用了不同的实现:

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

                                然后你将类导入你需要的任何页面,例如在 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...
                                      
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 2021-10-24
                                        • 2020-01-03
                                        • 2022-01-09
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2011-04-13
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多