我想在Dart中模仿C sprintf("%02d", x);
,但我无法找到字符串格式,只能进行字符串插值。
答案 0 :(得分:6)
字符串插值可满足您的大部分需求。如果您想直接格式化数字,还有num.toStringAsPrecision()
。
答案 1 :(得分:6)
intl库提供了几个格式化值的帮助器。 请参阅http://api.dartlang.org/docs/releases/latest/intl.html
上的API文档以下是如何将数字转换为双字符串的示例:
import 'package:intl/intl.dart';
main() {
var twoDigits = new NumberFormat("00", "en_US");
print(twoDigits.format(new Duration(seconds: 8)));
}
答案 2 :(得分:5)
String.format 方法目前不存在,但有一个bug/feature request用于添加它。
答案 3 :(得分:3)
我对此问题采取了不同的方法:通过直接填充字符串,我不必使用任何库(主要是因为intl库似乎已经停止):
x.toString().padLeft(2, "0");
相当于sprintf("%02d",x);
答案 4 :(得分:2)
这是我对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
答案 5 :(得分:0)
是的,Dart有一个sprintf软件包: https://pub.dev/packages/sprintf。 它是根据C的sprintf建模的。
答案 6 :(得分:0)
查看format package。它类似于Python中的format()。这是一个新包装。需要测试。