如何在Dart中将数字格式化为千位分隔符

38

我需要在Dart中将数字格式化为千位分隔符。 我有如下的数字:

16987

13876

456786

我希望将它们格式化为:

16,987

13,876 

4,56,786

你可以尝试使用intl包中的NumberFormat - JideGuru
10个回答

64

您可以在ICU格式化模式中传递自定义格式,使用NumberFormat,请参见NumberFormat

import 'package:intl/intl.dart';

void main() {
  var formatter = NumberFormat('#,##,000');
  print(formatter.format(16987));
  print(formatter.format(13876));
  print(formatter.format(456786));
}

输出

16,987
13,876
4,56,786

能否对字符串做同样的操作?我在尝试中遇到了困难。 - Mano Haran
1
@ManoHaran 你好!使用 double.tryParse("10000") 或者 double.parse("10000"),然后进行格式化即可。 - Dlani Mendes
嗨!我想知道如何将此应用于显示带有“.”作为分隔符的数字。当我尝试上面的代码时,它会返回一个错误-->模式“StringIterator的实例”中有多个小数分隔符。我们如何告诉包我们将使用不同的分隔符。我已经尝试使用locale,但它不起作用。 - Naufal Rajabi
嗨@NaufalRajabi,根据您的需要选择不同的语言环境,并尝试此示例:var formatter = NumberFormat('#,##,000',“ar_DZ”);参考 => https://github.com/dart-lang/intl/blob/master/lib/number_symbols_data.dart - Dlani Mendes

22

我发现intl包中的NumberFormat类非常有用,因为它提供了不同的方式来格式化数字。

默认情况下,NumberFormat类使用默认的美国区域设置以百万为单位格式化数字,我们可以使用印度区域设置将数字格式化为“lakh”(它可以根据任何国家/地区语言环境格式化数字或货币)。NumberFormat.decimalPattern([String locale]).

import 'package:intl/intl.dart';   

void main() {
  NumberFormat numberFormat = NumberFormat.decimalPattern('hi');
  print(numberFormat.format(16987));
  print(numberFormat.format(13876));
  print(numberFormat.format(456786));
}

输出

16,987
13,876
4,56,786

6

您不需要在此之前使用 NumberFormat 包。以下代码应该可以帮助您,您可以使用任何数字进行测试。

String formatAmount(){
    String price = "1000000000";
    String priceInText = "";
    int counter = 0;
    for(int i = (price.length - 1);  i >= 0; i--){
        counter++;
        String str = price[i];
        if((counter % 3) != 0 && i !=0){
          priceInText = "$str$priceInText";
        }else if(i == 0 ){
          priceInText = "$str$priceInText";
        
        }else{
          priceInText = ",$str$priceInText";
        }
    }
    return priceInText.trim();
  }

然后你可以通过打印使用:

print(formatAmount());

输出:

 1,000,000,000

4
如果您想要带有小数的逗号分隔值,请使用`decimalPatternDigits`初始化程序,并通过`decimalDigits`参数控制小数位数。
将`decimalDigits`参数值设置为`0`将不显示小数位。 带有小数
import 'package:intl/intl.dart';

NumberFormat formatter = NumberFormat.decimalPatternDigits(
    locale: 'en_us',
    decimalDigits: 2,
);

print(formatter.format(17459));
print(formatter.format(1000000));
print(formatter.format(100100.05));
print(formatter.format(100100.016));

输出

17,459.00
1,000,000.00
100,100.05
100,100.02

没有小数

import 'package:intl/intl.dart';

NumberFormat formatter = NumberFormat.decimalPatternDigits(
    locale: 'en_us',
    decimalDigits: 0,
);

print(formatter.format(100100.05));
print(formatter.format(100100.999));

输出

100,100
100,101

2
那项活动的伪代码大致如下:
Here, `string` is an input string with indexes starting at 0.
let i = (length of string) - 3
while i > 0 do
    insert a "," into string at position (i)
    let i = i - 3
return string

DartCode

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();
  }
}

1

您可以使用更灵活的扩展:

/// Return as number as formatted in thousands string.
/// Example: -123456.asThousands() returns -123'456
String asThousands({
  final String separator = "'",
  final int digits = 3,
}) {
  assert(digits >= 1, '5d40ef0f-f8b4-4070-adf4-bbfc1a8b663b');
  final chars =
      abs().truncate().toString().split(StringHelper.empty).reversed;
  var n = 0;
  var result = StringHelper.empty;
  for (final ch in chars) {
    if (n == digits) {
      result = '$ch$separator$result';
      n = 1;
    } else {
      result = '$ch$result';
      n++;
    }
  }
  result = this < 0 ? '-$result' : result;
  result = (this is double)
      ? '$result${toString().substring(toString().lastIndexOf('.'))}'
      : result;
  return result;
}

示例调用:

test('Test NumHelper.asThousands()', () {
  expect(
    123456789.asThousands(separator: StringHelper.space),
    '123 456 789',
  );
  expect(123456789.asThousands(separator: ','), '123,456,789');
  expect(
    123456789.asThousands(separator: ',', digits: 2),
    '1,23,45,67,89',
  );
  expect((-123456789).asThousands(separator: ','), '-123,456,789');
  expect((-123456).asThousands(separator: ','), '-123,456');
  expect((-12345).asThousands(separator: ','), '-12,345');
  expect(1.asThousands(), '1');
  expect(12.asThousands(), '12');
  expect(123.asThousands(), '123');
  expect(1995.asThousands(), "1'995");
  expect(12345678.asThousands(), "12'345'678");
  expect((-123456789.123).asThousands(separator: ','), '-123,456,789.123');
});

1

这是印度货币的格式。因此,intl包允许您将数字转换为本地货币,使用标准模式。对于印度格式,您可以使用。

NumberFormat.currency(locale: 'en_IN', symbol: '₹ ').format(value);

或者您可以像这样创建一个扩展。

import 'package:intl/intl.dart';

extension Currency on double {
  String indianFormat() {
    return NumberFormat.currency(locale: 'en_IN', symbol: '₹ ').format(this);
  }
}

0

如果您想使用千位分隔符格式化数字并给它一个最大的小数位数。

var formatter = NumberFormat('#,##0.' + "#" * 5); 

print(formatter.format(double.parse('1000.456781234'.replaceAll(",", ""))));

OUTPUT: 1,000.45678

希望这能有所帮助。 :)

0

千位分隔符

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

'2352' ---> '2.352'

'3452' ---> '23.452'

'235223' ---> '235.223'

点号 . 是为了土耳其使用,分隔符请在代码末尾将 . 更改为 ,


0

这里最简单的方法是使用intl中的NumberFormat类,请按照以下步骤进行操作。

将此包添加到您的pubspec.yaml中。

dependencies:
  intl: ^0.17.0

在你的Dart扩展文件中使用以下代码行
final numberFormat = NumberFormat.decimalPattern('hi');

extension ExtOnNum on num {
  format() {
    final parts = toString().split('.');
    return '${numberFormat.format(num.tryParse(parts[0]) ?? 0.0)}.${parts[1]}';
  }
}

输出:

print(5843.41.format());

5,843.41

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接