如何格式化插入字符串

H3c*_*H3c 13 dart flutter

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

ena*_*dun 12

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

dependencies:
  sprintf: "^4.0.0"
Run Code Online (Sandbox Code Playgroud)

然后运行pub install。

接下来,导入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);
}
Run Code Online (Sandbox Code Playgroud)

输出量

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

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

  • 我们真的需要“未经验证的上传者”的第 3 方包来获取字符串格式吗?他妈的地狱飞镖 (3认同)

Gün*_*uer 10

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");
Run Code Online (Sandbox Code Playgroud)

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

print('Calc 3 + 5 = ${3 + 5}');
Run Code Online (Sandbox Code Playgroud)

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

参见例如:

  • 但是,这不是问题作者所要的。从*其他来源*提取的字符串(例如服务器)可以包含*通配符*,并且在* Android *中(要求输入),String.format(stringWithWildcards,一,二,三)可以工作。您将如何在* Dart *中执行此操作? (9认同)
  • 我认为这不是问题的答案。 (4认同)

Sup*_*ode 8

我用老式的方式做到了

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


Phi*_*ins 6

如果您想要类似于 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;
}
Run Code Online (Sandbox Code Playgroud)

然后您可以调用interpolate(STRING_TO_INTERPOLATE, LIST_OF_STRINGS)并且您的字符串将被插入。

扩展

您可以创建一个与 Android 类似的扩展函数 String.format()

extension StringExtension on String {
    String format(List<String> params) => interpolate(this, params);
}
Run Code Online (Sandbox Code Playgroud)

这将允许你打电话 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);
  });
Run Code Online (Sandbox Code Playgroud)


Mar*_*ten 6

如前所述,我也使用了 sprintf 包,但也使用了 String 类的方便扩展。

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

extension StringFormatExtension on String {
  String format(var arguments) => sprintf(this, arguments);
}
Run Code Online (Sandbox Code Playgroud)

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

String myFormattedString = 'Hello %s!'.format('world');
Run Code Online (Sandbox Code Playgroud)

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