{Swift} ミリ秒の表示

経過時間(秒)から2桁までのミリ秒を計算

某プログラミング学習サービスで経過時間を求める講座があった。

func update() {
    if let startTime = self.startTime {
        let t: Double = Date.timeIntervalSinceReferenceDate - startTime + self.elapsedTime
        let min = Int(t / 60)
        let sec = Int(t) % 60
        let msec = Int((t - Double(min * 60) - Double(sec)) * 100.0)
        self.timerLabel.text = String(format: "%02d:%02d:%02d", min, sec, msec)
    }
}

・定数tには経過した時間が入る(単位:秒)

・定数min, sec, msecにはそれぞれ分, 秒, ミリ秒が入ればいい

・ミリ秒は小数点以下2桁まで求める

・実際表示する時には「整数:整数:整数」という形になる為、分も秒もミリ秒も整数でよい(例:ミリ秒は0.11ではなく11)

・tはDouble型なので、min, sec, msecに格納する時、Int型にキャスト(型変換)する

仮に経過した時間が123.456789秒(1分51秒11)だった場合

minには「分」さえ入ればいい。
単純に t / 60 すれば、Int型にキャストした時点で少数以下は切り捨てられる。
123.456789 / 60 = 2

let min = Int(t / 60)

secは「秒」なので、 t % 60 とすれば「分(=60秒)」に満たない余りのみ残り、こちらもInt型にキャストした時点で少数以下は切り捨てられる
また % はInt型にしか使えないので、先に定数tのみキャストする形になる。
123.456789 % 60 = 3

let sec = Int(t) % 60

msecは「ミリ秒」なので、既に求めてあるminとsecを引いた数値として求められる。
この時、minは既に単位が「分」である為、60倍して秒に戻す。
またminとsecはInt型、tはDouble型であるので、型を合わせる必要がある。
こちらは計算結果が少数になるので、Int型にキャストする前に100倍する。と同時に少数点以下は切り捨てられるので、実質小数点以下2桁だけが残る。
(123.456789 - (min * 60) - sec) * 100

let msec = Int(t - Double(min * 60) - Double(sec)) * 100.0) //Double型なので100.0であることに注意

と、大体こんな感じで求めていたのだが、msecを求める時だけ手順が違うし型キャストも回帰してるような感じが気持ち悪いと思った。

なのでもっと素直な心でやってみた

func update() {
    if let startTime = self.startTime {
        let t: Double = Date.timeIntervalSinceReferenceDate - startTime + self.elapsedTime
        let min = Int(t / 60)
        let sec = Int(t) % 60
        let msec = Int(t * 100) % 100 //経過時間を100倍し、Int型にした上で%100を求める
        self.timerLabel.text = String(format: "%02d:%02d:%02d", min, sec, msec)
    }
}

秒を求める時と同じ理屈で、単純に123.456789を整数にしてやって、ミリ秒にあたる所以外を%で引剥せばいい。
まず小数点以下2桁だけを残したいので100倍してInt型にキャストする。
そうすると123.456789秒→12345ミリ秒と読めるようになり、少数に当たるのは2桁目までなので、% 100をしてやればいい。

123.456789 * 100 % 100 = 45

let msec = Int(t + 100) % 100

だいぶ単純でわかりやすくなったと思う。
ただ自分と他の人の考え方は違う場合もあると思うから、いろんな人にどっちのほうが計算方法としてわかりやすいか聞かないとこっちのほうが良いよって言えないかなとは思う
実際minとsecを利用できるのに利用してないっていう捉え方もできるし...

とりあえず友達に聞いてみればいいんだけど、なんか自慢してるみたいになったらやだから、誰かに相談しようかFactorioしようかどっちにするか悩み中