概要
DartのintlライブラリのNumberFormat classで若干ハマったので備忘録
やりたかったこと
数値に符号をつけたかった(+とか-とかカンマとか)
// 例
+5,000
-5,000
やり方
導入
今回はFlutterアプリへの導入なので
flutter pub add intl
まずはカンマをつける。
main.dart
import "package:intl/intl.dart";
void main() {
final String format = "#,##0";
final String formatDecimals = "#,##0.00";
print("result: " + NumberFormat(format).format(5000)); // result: 5,000
print("result: " + NumberFormat(formatDecimals).format(5000)); // result: 5,000.0
}
これは簡単
+ または - をつける
main.dart
import "package:intl/intl.dart";
void main() {
final String format = '+#,##0;-#,##0';
print("result: " + NumberFormat(format).format(5000)); // result: +5,000
print("result: " + NumberFormat(format).format(-5000)); // result: -5,000
}
これはformatの指定の仕方がわからずしばらくハマりました。
注意点
Stringでもできるらしいんですが、上記のやり方だと数値の型(num、int、double)以外でやるとエラーになるのでご注意ください。
私の場合は、値の引数をジェネリクスにした関数を作成して、Stringをnumにparseする形で対応しました。
numberFormat.dart
String numberFormat<T>(T value, int numberOfDecimals, bool sign) {
final String format = () {
var result = "#,##0";
if (1 <= numberOfDecimals) {
result += "." + ("0" * numberOfDecimals);
}
if (sign) {
return '+${result};-${result}';
}
return result;
}();
final num target = () {
if (T != int && T != double) {
final String stringTarget = value as String;
return num.parse(stringTarget);
}
return value as num;
}();
return NumberFormat(format).format(target);
}