在 C# 中我可以做到:
12341.4.ToString("##,#0.00")
结果是 12,345.40
dart 中的等价物是什么?
我也想找到解决方案,发现它现在按照以下示例实现。
import 'package:intl/intl.dart';
final oCcy = new NumberFormat("#,##0.00", "en_US");
void main () {
print("Eg. 1: ${oCcy.format(123456789.75)}");
print("Eg. 2: ${oCcy.format(.7)}");
print("Eg. 3: ${oCcy.format(12345678975/100)}");
print("Eg. 4: ${oCcy.format(int.parse('12345678975')/100)}");
print("Eg. 5: ${oCcy.format(double.parse('123456789.75'))}");
/* Output :
Eg. 1: 123,456,789.75
Eg. 2: 0.70
Eg. 3: 123,456,789.75
Eg. 4: 123,456,789.75
Eg. 5: 123,456,789.75
pubspec.yaml :
name: testCcy002
version: 0.0.1
author: BOH
description: Test Currency Format from intl.
dev_dependencies:
intl: any
Run pub install to install "intl"
*/
}
这是一个 flutter 实现的示例:
import 'package:intl/intl.dart';
final formatCurrency = new NumberFormat.simpleCurrency();
new Expanded(
child: new Center(
child: new Text('${formatCurrency.format(_moneyCounter)}',
style: new TextStyle(
color: Colors.greenAccent,
fontSize: 46.9,
fontWeight: FontWeight.w800)))),
例如,结果为 $#,###.## 或 $4,100.00。
注意 Text('${... 中的 $ 只是引用 ' ' 内的变量 _moneyCounter ,与格式化结果中添加的 $ 无关。
如果您不想打印货币符号:
import 'package:intl/intl.dart';
var noSimbolInUSFormat = new NumberFormat.currency(locale: "en_US",
symbol: "");
我是dart包money2的作者
https://pub.dev/packages/money2
该软件包支持固定精度的数学、货币格式和解析。
import 'money2.dart';
Currency usdCurrency = Currency.create('USD', 2);
// Create money from an int.
Money costPrice = Money.fromInt(1000, usdCurrency);
print(costPrice.toString());
> $10.00
final taxInclusive = costPrice * 1.1;
print(taxInclusive.toString())
> $11.00
print(taxInclusive.format('SCC #.00'));
> $US 11.00
// Create money from an String using the `Currency` instance.
Money parsed = usdCurrency.parse(r'$10.00');
print(parsed.format('SCCC 0.0'));
> $USD 10.00
// Create money from an int which contains the MajorUnit (e.g dollars)
Money buyPrice = Money.from(10);
print(buyPrice.toString());
> $10.00
// Create money from a double which contains Major and Minor units (e.g. dollars and cents)
// We don't recommend transporting money as a double as you will get rounding errors.
Money sellPrice = Money.from(10.50);
print(sellPrice.toString());
> $10.50
var number = 10000;
final NumberFormat usCurrency = NumberFormat('#,##0', 'en_US');
print(' \$${usCurrency.format(number))}');
--
$10,000
如果您想在数字末尾写分:
final NumberFormat usCurrency = NumberFormat('#,##0.00', 'en_US');
--
$10,000.00
我用它。它对我有用
class MoneyFormat {
String price;
String moneyFormat(String price) {
if (price.length > 2) {
var value = price;
value = value.replaceAll(RegExp(r'\D'), '');
value = value.replaceAll(RegExp(r'\B(?=(\d{3})+(?!\d))'), ',');
return value;
}
}
}
在 TextFormField 中
onChanged: (text) {
priceController.text = moneyFormat.moneyFormat(priceController.text);
}
感谢@Richard Morgan(答案上面)
这是我最终的解决方案。
注意:您需要这两个套餐才能使用其他货币。 另外,请检查您使用的数据类型,以确定是否要使用
int
而不是 String
。如果 int
则无需在 int.parse()
中使用
format()
轻松检查
print(amount.runtimeType);
//packages
import 'dart:io';
import 'package:intl/intl.dart';
final formatCurrency = NumberFormat.simpleCurrency(
locale: Platform.localeName, name: 'NGN');
final int amount;
// or final String amount; if gotten from json file
// check what type of data with - print(data.runtimeType);
//generate your constructors for final fields
Text(
'${formatCurrency.format(amount)}',
// or for String '${formatCurrency.format(int.parse(amount))}'
style: TextStyle(
color: Colors.white,
fontSize: 16,
),
),
import 'package:intl/intl.dart';
extension DoubleExt on double {
String toEuro() {
return NumberFormat.simpleCurrency(
name: 'EUR',
).format(this / 100);
}
String toPln() {
return NumberFormat.simpleCurrency(
name: 'PLN',
).format(this / 100);
}
}
只需在您的替身上使用它即可。
1000.0.toEuro()
=> €10.00
import 'package:intl/intl.dart';
final oCcy = NumberFormat.currency(
locale: 'eu',
customPattern: '#,### \u00a4',
symbol: 'FCFA',
decimalDigits: 2);
print(oCcy.format(12345)) // 12.345,00 FCFA
我写了一个函数来像金钱一样显示双精度数。请随意使用它。 导入 'dart:math';
extension DoubleExtension on double {
String displayLikeMoney({bool dollarSign = true}) {
String number = roundedPrecisionToString(2, trailingZeros: true);
List<String> parts = number.split('.');
String dollars = parts[0];
String cents = parts.length > 1 ? parts[1] : '';
String formattedDollars = '';
for (int i = 0; i < dollars.length; i++) {
int position = dollars.length - i;
if (position != dollars.length && position % 3 == 0) {
formattedDollars += ',';
}
formattedDollars += dollars[i];
}
String money =
cents.isNotEmpty ? '$formattedDollars.$cents' : formattedDollars;
return dollarSign ? '\$ $money' : money;
}
/// good for string output because it can remove trailing zeros
/// and sometimes periods. Or optionally display the exact number of trailing zeros
String roundedPrecisionToString(int places, {bool trailingZeros = false}) {
double mod = pow(10.0, places) as double;
double round = ((this * mod).round().toDouble() / mod);
String doubleToString =
trailingZeros ? round.toStringAsFixed(places) : round.toString();
if (!trailingZeros) {
RegExp trailingZeros = RegExp(r'^[0-9]+.0+$');
if (trailingZeros.hasMatch(doubleToString)) {
doubleToString = doubleToString.split('.')[0];
}
}
return doubleToString;
}
}