【问题标题】:How to insert characters into a Dart String?如何在 Dart 字符串中插入字符?
【发布时间】:2019-07-02 02:20:29
【问题描述】:

我想在给定位置的 Dart 字符串中添加一些空格,就像 this(在 Java 中)。

所以...

'XPTOXXSFXBAC' become 'XPTO XXSF XBAC'

有什么简单的方法吗?

【问题讨论】:

  • 是的,见String.replaceAllMapped()方法

标签: flutter dart libraries


【解决方案1】:

你可以使用String中的replaceAllMapped方法,你必须添加正则表达式,像这样:

 final value =  "XPTOXXSFXBAC".replaceAllMapped(RegExp(r".{4}"), (match) => "${match.group(0)} ");
 print("value: $value");

【讨论】:

  • 比我预期的要详细一点,但是谢谢 :)
  • 但是有一个问题,如果我们使用“-”分隔,那么它会在字符串的末尾添加-
  • 这将在字符串末尾添加一个额外的空格。为防止这种情况,请使用trimRight() 方法。 "XPTOXXSFXBAC".replaceAllMapped(RegExp(r".{4}"), (match) => "${match.group(0)} ").trimRight()。如果您使用的字符不是空格,请使用str.substring(0, str.length - 1)
【解决方案2】:
 var x= 'XPTOXXSFXBAC';
 x = x.substring(0, 4) + " " + x.substring(4, 8) + " " + x.substring(8, x.length);
 print(x) ;

【讨论】:

    【解决方案3】:

    有一个 dart 包,为字符串操作提供了一些帮助类。

    Github:https://github.com/Ephenodrom/Dart-Basic-Utils 安装它:

    dependencies:
      basic_utils: ^1.5.0
    

    用法

    String s = "";
    s = StringUtils.addCharAtPosition("1234567890", "-", 3);
    print(s); // "123-4567890"
    s = StringUtils.addCharAtPosition("1234567890", "-", 3, repeat: true); 
    print(s); // "123-456-789-0"
    s = StringUtils.addCharAtPosition("1234567890", "-", 12);
    print(s); // "1234567890"
    

    附加信息:

    这些都是来自 StringUtils 类的方法。

    String defaultString(String str, {String defaultStr = ''});
    bool isNullOrEmpty(String s);
    bool isNotNullOrEmpty(String s);
    String camelCaseToUpperUnderscore(String s);
    String camelCaseToLowerUnderscore(String s);
    bool isLowerCase(String s);
    bool isUpperCase(String s);
    bool isAscii(String s);
    String capitalize(String s);
    String reverse(String s);
    int countChars(String s, String char, {bool caseSensitive = true});
    bool isDigit(String s);
    bool equalsIgnoreCase(String a, String b);
    bool inList(String s, List<String> list, {bool ignoreCase = false});
    bool isPalindrome(String s);
    String hidePartial(String s, {int begin = 0, int end, String replace = "*"});
    String addCharAtPosition(String s, String char, int position,{bool repeat = false});
    

    【讨论】:

    • 不错。我试试看
    • 好回答的朋友。这是一个可爱的图书馆。但是,我更喜欢接受的答案:)
    【解决方案4】:

    您的问题过于具体:您只想将字符(或字符串)插入另一个 Dart 字符串。空格并不特殊。

    方法#1

    String toSpaceSeparatedString(String s) {
      var start = 0;
      final strings = <String>[];
      while (start < s.length) {
        final end = start + 4;
        strings.add(s.substring(start, end));
        start = end;
      }
      return s.join(' ');
    }
    

    方法 #2(效率较低)

    String toSpaceSeparatedString(String s) {
      const n = 4;
      assert(s.length % n == 0);
      var i = s.length - n;
      while (i > 0) {
        s = s.replaceRange(i, i, ' ');
        i -= n;
      }
      return s;
    }
    

    方法#2 效率较低(它需要重复插入String,因此涉及重复复制String 的相同部分)并且更笨拙(它从String 的末尾迭代到开始以便索引是稳定的),并且有更多的极端情况(为简单起见,我假设输入字符串可以被子字符串长度整除)。但是,我将它包含在此处是因为它演示了使用 String.replaceRange,这通常有助于将一个 String 插入另一个 String,并且对于一次性情况可能会更简单。

    【讨论】:

      【解决方案5】:

      用于在 dart 中显示 15XX XXXX XXXX 9876 之类的卡号

      String num1 = "1567456789099876".replaceAll(RegExp(r'(?<=.{2})\d(?=.{4})'), 'X');
      String num  = num1.replaceAllMapped(RegExp(r".{4}"), (match) => "${match.group(0)} ");
      
      print(num); //15XX XXXX XXXX 9876
      

      【讨论】:

        【解决方案6】:

        使用allMatches,我有一个更简单的@diegoveloper 答案版本。使用join 不会是额外的分隔符。

        final myText = 'XPTOXXSFXBAC';
        final separator = ' ';
        
        final result = RegExp(r".{2}")
                       .allMatches(myText)
                       .map((e) => e.group(0))
                       .join(separator);
        

        【讨论】:

          猜你喜欢
          • 2019-05-07
          • 2019-12-18
          • 1970-01-01
          • 2014-10-03
          • 2011-05-04
          • 1970-01-01
          • 2020-07-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多