Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@lacolaco

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
15
Help us understand the problem. What are the problem?