簡體   English   中英

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

[英]How to capitalize the first letter of a string in dart?

如何在不更改任何其他字母的情況下將字符串的第一個字符大寫?

例如,“這是一個字符串”應該給出“這是一個字符串”。

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

將此復制到某處:

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

其他答案中的子字符串解析不考慮語言環境差異。 intl/intl.dart包中的toBeginningOfSentenceCase()函數處理基本的句子大小寫和土耳其語和阿塞拜疆語中的帶點“i”。

import 'package:intl/intl.dart';
...
String sentence = toBeginningOfSentenceCase('this is a string'); // This is a string
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

或者,您可以使用strings 包,請參閱大寫

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

安裝它:

dependencies:
  basic_utils: ^1.2.0

用法 :

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

GitHub:

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

您可以在 flutter ReCase 中使用此包,它為您提供各種大小寫轉換功能,例如:

  • 蛇案例
  • 點.case
  • 路徑/案例
  • 參數案例
  • 帕斯卡案例
  • 標題案例
  • 標題案例
  • 駱駝香煙盒
  • 判例案
  • CONSTANT_CASE

     ReCase sample = new ReCase('hello world'); print(sample.sentenceCase); // Prints 'Hello world'
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

要檢查 null 和空字符串情況,也使用短符號:

  String capitalizeFirstLetter(String s) =>
  (s?.isNotEmpty ?? false) ? '${s[0].toUpperCase()}${s.substring(1)}' : s;
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!');
});

您可以使用字符串庫的 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 

您還應該檢查字符串是否為空或空。

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

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

StringUtils.capitalize("yourString");

這對於單個函數來說是可以接受的,但是在更大的操作鏈中,它變得很尷尬。

Dart 語言文檔中所述

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

該代碼的可讀性低於

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

代碼也不太容易發現,因為 IDE 可以建議在doMyStuff()之后使用doMyStuff() something.doStuff() ,但不太可能建議將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()

或者,如果您的值可以為空,請將點替換為“?.” 在調用中:

myObject.property?.toString()?.capitalized()

奇怪的是,這在 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"

這段代碼對我有用。

String name = 'amina';    

print(${name[0].toUpperCase()}${name.substring(1).toLowerCase()});

這是使用 String 類方法splitMapJoin在 dart 中大寫字符串的另一種替代方法:

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 

超級晚,但我使用,


String title = "some string with no first letter caps";
    
title = title.replaceFirst(title[0], title[0].toUpperCase()); // Some string...

var orig = "this is a string";
var changed = orig.substring(0, 1).toUpperCase + orig.substring(1)

一些更受歡迎的其他答案似乎無法處理null'' 我寧願不必在客戶端代碼中處理這些情況,無論如何我只想要一個String返回 - 即使這意味着null情況下為null

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

你可以使用 Text_Tools 包,使用起來很簡單:

https://pub.dev/packages/text_tools

你的代碼是這樣的:

//This will print 'This is a string
print(TextTools.toUppercaseFirstLetter(text: 'this is a string'));

最簡單的答案在這里:

首先使用其索引將字符串的第一個字母大寫,然后連接字符串的其余部分。

這里用戶名是字符串。

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

我使用了 Hannah Stark 的答案,但如果字符串為空,它會使應用程序崩潰,因此這里是帶有擴展名的解決方案的改進版本:

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

使用字符而不是代碼單元

正如文章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的習慣仍然是一個好主意。

字符包隨 Flutter 一起提供,因此無需導入。 在純 Dart 項目中,您需要添加導入,但不必向 pubspec.yaml 添加任何內容。

截至 2021 年 3 月 23 日 Flutter 2.0.2

只需使用yourtext.capitalizeFirst

在檢查范圍內。
Dart >2.16.1 的慣用語

作為 function

String capitalize(String str) =>
    str.isNotEmpty
        ? str[0].toUpperCase() + str.substring(1)
        : str;

作為擴展

extension StringExtension on String {
    String get capitalize => 
        isNotEmpty 
            ? this[0].toUpperCase() + substring(1) 
            : this;
}
String fullNameString =
    txtControllerName.value.text.trim().substring(0, 1).toUpperCase() +
        txtControllerName.value.text.trim().substring(1).toLowerCase();

這是我使用 dart String 方法的答案。

String name = "big";
String getFirstLetter = name.substring(0, 1);    
String capitalizedFirstLetter =
      name.replaceRange(0, 1, getFirstLetter.toUpperCase());  
print(capitalizedFirstLetter);

特此分享我的答案

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

我發現解決這個問題的另一種不健康的方法是

String myName = "shahzad";

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

這將產生相同的效果,但這是一種非常骯臟的方式。

我使用了不同的實現:

  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()]),
),

你可以使用這個:

extension EasyString on String {
  String toCapitalCase() {
   var lowerCased = this.toLowerCase();
   return lowerCased[0].toUpperCase() + lowerCased.substring(1);
 }
} 
extension StringExtension on String {
  String capitalize() {
    return this
        .toLowerCase()
        .split(" ")
        .map((word) => word[0].toUpperCase() + word.substring(1, word.length))
        .join(" ");
  }
}

對於任何感興趣的人,這應該適用於任何字符串

您可以使用這個 function:

String capitalize(String str) {
  return str
      .split(' ')
      .map((word) => word.substring(0, 1).toUpperCase() + word.substring(1))
      .join(' ');
}

如果您想將句子中的每個單詞大寫,請使用以下代碼,例如,如果您想將客戶全名的每個部分大寫,只需在 model class 中使用以下擴展名:

extension StringExtension on String {
  String capitalizeFirstLetter() {
    return "${this[0].toUpperCase()}${this.substring(1).toLowerCase()}";
  }
}

並簡單地使用這個吸氣劑

String get formalFullName =>  fullName.capitalizeFirstLetter().splitMapJoin(RegExp(r' '),
                onNonMatch: (str) => str.toString().capitalize());

希望這對某人有幫助

如何將字符串的第一個字符大寫,同時不改變任何其他字母的大小寫?

例如,“這是一個字符串”應該給出“這是一個字符串”。

final helloWorld = 'hello world'.toUpperCase(); 文本(你好世界);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM