我需要在Dart中将数字格式化为千位分隔符。 我有如下的数字:
16987
13876
456786
我希望将它们格式化为:
16,987
13,876
4,56,786
您可以在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
double.tryParse("10000")
或者 double.parse("10000")
,然后进行格式化即可。 - Dlani Mendesvar formatter = NumberFormat('#,##,000',“ar_DZ”);
参考 => https://github.com/dart-lang/intl/blob/master/lib/number_symbols_data.dart - Dlani Mendes我发现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
您不需要在此之前使用 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
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
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();
}
}
您可以使用更灵活的扩展:
/// 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');
});
这是印度货币的格式。因此,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);
}
}
如果您想使用千位分隔符格式化数字并给它一个最大的小数位数。
var formatter = NumberFormat('#,##0.' + "#" * 5);
print(formatter.format(double.parse('1000.456781234'.replaceAll(",", ""))));
OUTPUT: 1,000.45678
千位分隔符
stringAmount.replaceAllMapped(RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => "${m[1]}.");
'2352' ---> '2.352'
'3452' ---> '23.452'
'235223' ---> '235.223'
点号 . 是为了土耳其使用,分隔符请在代码末尾将 . 更改为 ,
这里最简单的方法是使用intl
中的NumberFormat类,请按照以下步骤进行操作。
将此包添加到您的pubspec.yaml
中。
dependencies:
intl: ^0.17.0
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
intl
包中的NumberFormat
。 - JideGuru