LoginSignup
41
17

More than 5 years have passed since last update.

Dartでゼロ埋めするライブラリを作ったら実は標準APIにあった話

Last updated at Posted at 2014-11-01

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の呼び出しに切り替えました。

41
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
17