Dart 有 sprintf 还是只有插值?

发布于 2025-01-05 16:10:16 字数 78 浏览 1 评论 0原文

我想在 Dart 中模拟 C 的 sprintf("%02d", x);,但我找不到字符串格式,只能找到字符串插值。

I would like to emulate C's sprintf("%02d", x); in Dart, but I can't find string formatting, only string interpolation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

漆黑的白昼 2025-01-12 16:10:17

请参阅格式包。它类似于 Python 中的 format()。这是一个新包。需要测试。

See a format package. It is similar to format() from Python. It is a new package. Needs testing.

高跟鞋的旋律 2025-01-12 16:10:16

字符串插值可以满足您的大部分需求。如果想直接格式化数字,还有num.toStringAsPrecision()

String interpolation covers most of your needs. If you want to format numbers directly, there is also num.toStringAsPrecision().

梦幻的心爱 2025-01-12 16:10:16

我对这个问题采取了不同的方法:通过直接填充字符串,我不必使用任何库(主要是因为 intl 库似乎已停止使用):

x.toString().padLeft(2, "0");

相当于 sprintf("%02d", x) ;

I took a different approach to this issue: by padding the string directly, I don't have to use any libraries (mainly because the intl library seems to be discontinued):

x.toString().padLeft(2, "0");

Would be the equivalent of sprintf("%02d", x);

紫南 2025-01-12 16:10:16

intl 库提供了几个格式化值的帮助器。
请参阅 API 文档 http://api.dartlang.org/docs/releases/ latest/intl.html

下面是如何将数字转换为两个字符串的示例:

import 'package:intl/intl.dart';

main() {
    var twoDigits = new NumberFormat("00", "en_US");
    print(twoDigits.format(new Duration(seconds: 8)));
}

The intl library provides several helpers to format values.
See the API documentation at http://api.dartlang.org/docs/releases/latest/intl.html

Here is an example on how to convert a number into a two character string:

import 'package:intl/intl.dart';

main() {
    var twoDigits = new NumberFormat("00", "en_US");
    print(twoDigits.format(new Duration(seconds: 8)));
}
淡淡绿茶香 2025-01-12 16:10:16

目前不存在 String.format 方法,但有一个 添加它的错误/功能请求

A String.format method does not currently exists but there is a bug/feature request for adding it.

给妤﹃绝世温柔 2025-01-12 16:10:16

这是我为 Dart 实现的 String.format。它并不完美,但对我来说已经足够好了:

static String format(String fmt,List<Object> params) {
  int matchIndex = 0;
  String replace(Match m) {
    if (matchIndex<params.length) {
      switch (m[4]) {
        case "f":
          num val = params[matchIndex++];
          String str;
          if (m[3]!=null && m[3].startsWith(".")) {
            str = val.toStringAsFixed(int.parse(m[3].substring(1)));
          } else {
            str = val.toString();
          }
          if (m[2]!=null && m[2].startsWith("0")) {
             if (val<0) {
               str = "-"+str.substring(1).padLeft(int.parse(m[2]),"0");
             } else {
               str = str.padLeft(int.parse(m[2]),"0");
             }
          }
          return str;
        case "d":
        case "x":
        case "X":
          int val = params[matchIndex++];
          String str = (m[4]=="d")?val.toString():val.toRadixString(16); 
          if (m[2]!=null && m[2].startsWith("0")) {
            if (val<0) {
              str = "-"+str.substring(1).padLeft(int.parse(m[2]),"0");
            } else {
              str = str.padLeft(int.parse(m[2]),"0");
            }
          }
          return (m[4]=="X")?str.toUpperCase():str.toLowerCase();
        case "s":
          return params[matchIndex++].toString(); 
      }
    } else {
      throw new Exception("Missing parameter for string format");
    }
    throw new Exception("Invalid format string: "+m[0].toString());
  }

测试输出如下:

  format("%d", [1]) // 1
  format("%02d", [2]) // 02
  format("%.2f", [3.5]) // 3.50
  format("%08.2f", [4]) // 00004.00
  format("%s %s", ["A","B"]) // A B
  format("%x", [63]) // 3f
  format("%04x", [63]) // 003f
  format("%X", [63]) //3F

Here is my implementation of String.format for Dart. It is not perfect but works good enough for me:

static String format(String fmt,List<Object> params) {
  int matchIndex = 0;
  String replace(Match m) {
    if (matchIndex<params.length) {
      switch (m[4]) {
        case "f":
          num val = params[matchIndex++];
          String str;
          if (m[3]!=null && m[3].startsWith(".")) {
            str = val.toStringAsFixed(int.parse(m[3].substring(1)));
          } else {
            str = val.toString();
          }
          if (m[2]!=null && m[2].startsWith("0")) {
             if (val<0) {
               str = "-"+str.substring(1).padLeft(int.parse(m[2]),"0");
             } else {
               str = str.padLeft(int.parse(m[2]),"0");
             }
          }
          return str;
        case "d":
        case "x":
        case "X":
          int val = params[matchIndex++];
          String str = (m[4]=="d")?val.toString():val.toRadixString(16); 
          if (m[2]!=null && m[2].startsWith("0")) {
            if (val<0) {
              str = "-"+str.substring(1).padLeft(int.parse(m[2]),"0");
            } else {
              str = str.padLeft(int.parse(m[2]),"0");
            }
          }
          return (m[4]=="X")?str.toUpperCase():str.toLowerCase();
        case "s":
          return params[matchIndex++].toString(); 
      }
    } else {
      throw new Exception("Missing parameter for string format");
    }
    throw new Exception("Invalid format string: "+m[0].toString());
  }

Test output follows:

  format("%d", [1]) // 1
  format("%02d", [2]) // 02
  format("%.2f", [3.5]) // 3.50
  format("%08.2f", [4]) // 00004.00
  format("%s %s", ["A","B"]) // A B
  format("%x", [63]) // 3f
  format("%04x", [63]) // 003f
  format("%X", [63]) //3F
如痴如狂 2025-01-12 16:10:16

是的,Dart 有一个 sprintf 包:
https://pub.dev/packages/sprintf
它是仿照C 的sprintf 设计的。

Yes, Dart has a sprintf package:
https://pub.dev/packages/sprintf.
It is modeled after C's sprintf.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文