【问题标题】:Dart how to add commas to a string numberDart如何将逗号添加到字符串编号
【发布时间】:2015-11-03 01:23:39
【问题描述】:

我正在尝试适应这一点: Insert commas into number string 在飞镖工作,但没有运气。

其中任何一个都不起作用:

print("1000200".replaceAllMapped(new RegExp(r'/(\d)(?=(\d{3})+$)'), (match m) => "${m},"));
print("1000300".replaceAll(new RegExp(r'/\d{1,3}(?=(\d{3})+(?!\d))/g'), (match m) => "$m,"));

有没有一种更简单/有效的方法可以将逗号添加到字符串编号?

【问题讨论】:

  • 在第一次改编中你错过了$&,替换者。它仅适用于 JS,没有此替换表达式将不起作用。我们应该稍微改变一下表情,看看我下面的答案。

标签: regex string dart masking


【解决方案1】:

您只是忘记了将第一个数字分组。使用这个简短的:

'12345kWh'.replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => '${m[1]},')

查看可读版本。在表达式的最后一部分,我添加了对任何非数字字符的检查,包括字符串结尾,因此您也可以将其与 '12 Watt' 一起使用。

RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))');
String Function(Match) mathFunc = (Match match) => '${match[1]},';

List<String> tests = [
  '0',
  '10',
  '123',
  '1230',
  '12300',
  '123040',
  '12k',
  '12 ',
];

for (String test in tests) {    
  String result = test.replaceAllMapped(reg, mathFunc);
  print('$test -> $result');
}

完美运行:

0 -> 0
10 -> 10
123 -> 123
1230 -> 1,230
12300 -> 12,300
123040 -> 123,040
12k -> 12k
12  -> 12 

【讨论】:

  • Kelegorm,太棒了!太感谢了!那行得通。这是我的工作代码:print("1000200".replaceAllMapped(new RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) =&gt; "${m[1]},"));
  • 谢谢!你能解释一下它是如何工作的吗?
  • 没什么特别的,通常的正则表达式的东西。你可以阅读任何关于这方面的书。我读过那个:oreilly.com/library/view/mastering-regular-expressions/…
【解决方案2】:
import 'package:intl/intl.dart';

var f = NumberFormat("###,###.0#", "en_US");
print(f.format(int.parse("1000300")));

打印 1,000,300.0 检查飞镖的NumberFormat here

格式被指定为使用 ICU 格式化模式的子集的模式。

  • 0 个数字
  • #单个数字,如果值为零则省略
  • 。小数分隔符
  • -减号
  • ,分组分隔符
  • E 分隔尾数和指数
  • + - 在指数之前,表示它应该以加号为前缀。
  • % - 在前缀或后缀中,乘以 100 并显示为百分比
  • ‰ (\u2030) 在前缀或后缀中,乘以 1000 并显示为 per mille
  • ¤ (\u00A4) 货币符号,替换为货币名称
  • ' 用于引用特殊字符
  • ;用于区分正负模式(如果两者都存在)

【讨论】:

    【解决方案3】:

    试试下面的正则表达式:(\d{1,3})(?=(\d{3})+$)

    这将提供两个反向引用,并使用它们替换您的号码,如 $1,$2, 将在它们应该在的位置添加逗号。

    【讨论】:

    • 这不会产生类似12,423, 的东西,在末尾添加一个逗号吗?
    • 不,它不会在新号码的末尾添加额外的逗号
    • 嗯,好吧,是的,我刚刚测试了它,你是对的。 GL OP!
    • Dungeonfire >> 我试着调整你的建议,但没有骰子。也许是我使用replaceAll的有限经验。 print("100030".replaceAll(new RegExp(r'(\d{1,3})(?=(\d{3})+$)'), '$1,$2'); 那不起作用..也不使用replaceAllMapped。
    【解决方案4】:

    我们以金额12000 为例。现在我们的预期金额应该是12,000.00

    所以,解决办法是

    double rawAmount = 12000;
    String amount = rawAmount.toStringAsFixed(2).replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => '${m[1]},');
    

    或者如果您不想添加.00,那么我们只需要使用toString() 而不是toStringAsFixed()

    String amount = rawAmount.toString().replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => '${m[1]},');
    

    【讨论】: