Dart 如何向字符串数字添加逗号

问题描述 投票:0回答:7

我正在尝试调整这一点: 在数字字符串中插入逗号 在 Dart 工作,但没有运气。

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

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,"));

是否有更简单/有效的方法来向字符串数字添加逗号?

regex string dart masking
7个回答
66
投票

您只是忘记将第一个数字放入组中。使用这个短的:

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

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

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 

15
投票
import 'package:intl/intl.dart';

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

打印 1,000,300.0 在这里检查 dart 的 NumberFormat

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

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

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]},');

2
投票

尝试以下正则表达式:

(\d{1,3})(?=(\d{3})+$)

这将提供两个反向引用,并使用它们替换您的号码,例如

$1,$2,
将在应该的位置添加逗号。


0
投票
extension on int {
  String get priceString {
    final numberString = toString();
    final numberDigits = List.from(numberString.split(''));
    int index = numberDigits.length - 3;
    while (index > 0) {
      numberDigits.insert(index, ',');
      index -= 3;
    }
    return numberDigits.join();
    
  }
}

0
投票

因为在 double 类型的情况下,输出会根据方式而变化,所以请检查它们。

如果您需要格式化整数,那么任何方法都可以。

//1233.45677 => 1,233.4567    
        String num='1233.45677';
        RegExp pattern = RegExp(r'(?<!\.\d*)(\d)(?=(?:\d{3})+(?:\.|$))');
        String Function(Match) replace = (m) => '${m[1]},';
        print(num..replaceAllMapped(pattern, replace));
    
//1233.45677 => 1,233.456,7

    String num='1233.45677';
    pattern = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))');
    String Function(Match) replace = (m) => '${m[1]},';
    print(num..replaceAllMapped(pattern, replace));

//1233.45677 => 1,233.46
//after import intl package, to be able to use NumberFormat
       
    String num='1233.45677';
    var f = NumberFormat("###,###.0#", "en");
    print(f.format(double.parse()));

如果数字是String类型。

    //in case of int data type
int.parse(num);
    //in case of double data type
double.parse(num);

0
投票

我最近在 Stack Overflow 上发现了您的解决方案,以可读的方式格式化数字,我想感谢您分享它。我在我的项目中实现了它,效果非常好。

但是,在使用该解决方案时,我意识到它可以变得更加方便和便携,以便在整个项目中使用,而不必每次需要时都导出该函数。这就是为什么我决定将其封装在 Dart 扩展中。

我创建了一个名为

FinantialFormat
的扩展,其中包含
formatToFinancial
方法,该方法接受可选参数以在需要时包含货币符号。这样,我现在只需在字符串上调用
formatToFinancial()
即可轻松地在项目中的任何位置使用此功能。

当然,我想对你最初的解决方案给予充分的信任。你的方法非常有帮助,我只是尝试改进在我的项目中使用它的方式。

如果您对此有任何建议或意见,我很乐意听到!


extension FinancialFormat on String {
  String mathFunc(Match match) => '${match[1]},';

  String formatToFinancial({
    bool isMoneySymbol = false,
  }) {
    final RegExp reg = RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))');

    final formatNumber = replaceAllMapped(reg, mathFunc);
    if (isMoneySymbol) {
      return '\$ $formatNumber';
    }
    return formatNumber;
  }
}

使用示例:

TitleH1(
          text: bank!.amount.toString().formatToFinancial(
                isMoneySymbol: true,
              ),
          color: colorScheme.onBackground,
          fontSize: 30.0,
        ),
© www.soinside.com 2019 - 2024. All rights reserved.