如何格式化插入字符串

时间:2018-06-26 09:37:56

标签: dart flutter

我需要格式字符串,例如"Send %d seconds ago""Harry like %s", "I think %1$s like %2$s"。这些可以在Android中实现,但是我不知道如何在Flutter Dart中实现。

6 个答案:

答案 0 :(得分:7)

Dart支持字符串插值

var seconds = 5;
print("Send $seconds seconds ago");

var harryLikes = 'Silvia';
var otherName = 'Erik';
var otherLikes = 'Chess';
print("Harry like $harryLikes", "I think $otherName like $otherLikes");

更复杂的表达式可以嵌入${...}

print('Calc 3 + 5 = ${3 + 5}');

数字类型和intl包提供了更多格式化数字和日期的方法。

例如参见

答案 1 :(得分:6)

将以下内容添加到您的pubspec.yaml

dependencies:
  sprintf: "^4.0.0"

然后运行 pub安装。

接下来,导入dart-sprintf:

import 'package:sprintf/sprintf.dart';

示例#

import 'package:sprintf/sprintf.dart';

void main() {
     double seconds = 5.0;
       String name = 'Dilki';
       List<String> pets = ['Cats', 'Dogs'];

       String sentence1 = sprintf('Sends %2.2f seconds ago.', [seconds]);
       String sentence2 = sprintf('Harry likes %s, I think %s likes %s.', [pets[0], name, pets[1]]);

       print(sentence1);
       print(sentence2);
}

输出

Sends 5.00 seconds ago. Harry likes Cats, I think Dilki likes Dogs.

来源:https://pub.dartlang.org/packages/sprintf

答案 2 :(得分:4)

如果您想要类似于Android(Today is %1$ and tomorrow is %2$)的字符串插值,则可以创建一个顶级函数或可以执行类似操作的扩展。在这种情况下,我将其与Android字符串相似,因为我当前正在移植Android应用(插值格式以1而不是0开头)

顶级功能

String interpolate(String string, List<String> params) {

  String result = string;
  for (int i = 1; i < params.length + 1; i++) {
    result = result.replaceAll('%${i}\$', params[i-1]);
  }

  return result;
}

然后您可以调用interpolate(STRING_TO_INTERPOLATE, LIST_OF_STRINGS),然后将对您的字符串进行插值。

扩展名

您可以创建一个扩展功能,其功能类似于Android String.format()

extension StringExtension on String {
    String format(List<String> params) => interpolate(this, params);
}

这将允许您呼叫text.format(placeHolders)

测试

浓度证明的测试组合:-

test('String.format extension works', () {
    // Given
    const String text = 'Today is %1\$ and tomorrow is %2\$';
    final List<String> placeHolders = List<String>()..add('Monday')..add('Tuesday');
    const String expected = 'Today is Monday and tomorrow is Tuesday';

    // When
    final String actual = text.format(placeHolders);

    // Then
    expect(actual, expected);
  });

答案 3 :(得分:2)

就像已经说过的那样,我还使用了sprintf包,但是还附带了String类的便捷扩展。

因此,在将包依赖项sprintf: "^4.0.0"添加到pubspecs.yaml中的依赖项列表之后,创建一个新的Dart文件,其中包含Spring类的扩展名,并提供如下格式方法:

extension StringFormatExtension on String {
  String format(var arguments) => sprintf(this, arguments);
}

现在,在导入包含StringFormatExtension扩展名的dart文件之后,您可以输入以下内容:

String myFormattedString = 'Hello %s!'.format('world');

感觉就像Java(我来自哪里)。

答案 4 :(得分:1)

我是用老式的方式做的

String url = "https://server.com/users/:id:/view";
print(url.replaceAll(":id:", "69");

答案 5 :(得分:0)

您还可以使用以下简单的方法:

  • 用法
interpolate('Hello {#}{#}, cool {#}',['world','!','?']);
// Hello world!, cool ?
  • 功能
  static const needleRegex = r'{#}';
  static const needle = '{#}';
  static final RegExp exp = new RegExp(needleRegex);

  static String interpolate(String string, List l) {
    Iterable<RegExpMatch> matches = exp.allMatches(string);

    assert(l.length == matches.length);

    var i = -1;
    return string.replaceAllMapped(exp, (match) {
      print(match.group(0));
      i = i + 1;
      return '${l[i]}';
    });
  }