zero_paddingというライブラリを作りました。GitHubのリポジトリはこちら
Dartにはnum.toString(format)がない
少しDartを書いたことがある方ならわかると思いますが、Dartは数値から文字列へのフォーマッティングをコアから分離しているので時折不便です。例えばこういうことが標準で出来ません。
10.toString("000") // => "010"
intlパッケージを使う
じゃあどうするかというとStackOverFlowなどでは国際化用のintlというライブラリを使う方法が各所で紹介されています。上の例を実現するとこうなります。
import "package:intl/intl.dart";
void main() {
var f = new NumberFormat("000");
print(f.format(1)); // => 001
}
intlのNumberFormatは"000.0"
とか、"###00.0"
とか指定できて強力で便利なんですが、このフォーマッティングにロケールが影響する(ロケールを反映できる)ので、ライブラリの容量の大半をロケール用のjsonファイルが占めています。デプロイの時とか回線が細いとめっちゃ困ります。
作ってみた
なので、シンプルに数値の0埋めだけができるライブラリを作った結果、こういうふうに書けるようになりました。
import "package:zero_padding/zero_padding.dart";
void main() {
print(zeroPadding(1, 3)); // => 001
}
標準APIにあった
ところがこれをpubに公開した後で気づいたんですが、Dart 1.3でString#padLeft
という関数が追加されていまして、これで完全に互換可能でした。padLeftを使うとこう書けます。
void main() {
print(1.toString().padLeft(3, "0")); // => 001
}
あれ、作る必要なかったんじゃ……
ベンチマークで比較
もしかしたら自分の実装のほうが速いかもしれない!と思ってintl、padLeft、俺俺実装でベンチマーク取りました。
intl:NumberFormat(RunTime): 30.141817250162013 us.
String.padLeft(RunTime): 0.4253795927968772 us.
my code(RunTime): 5.899635402532123 us.
String.padLeft速い!!!!さすがDart!!!!便利なAPIがあるもんだ!!!
教訓
ちゃんと標準APIを調べてからライブラリを作ろう。
ちなみにzero_paddingの実装はオリジナルの実装から上のpadLeftの呼び出しに切り替えました。