

たとえば`timeInterval = 124.04521142`という数値を  
`02:04.04`というString型の値にしたいのですが、  
フォーマットについての理解が浅いためか、以下のように初心者ながらに冗長気味なのがわかります・・・

[code]

    let min = timeInterval / 60
    let sec = Int(timeInterval.truncatingRemainder(dividingBy: 60))
    
    let timeIntervalInteger = Int(timeInterval)
    let decimal = timeInterval - Double(timeIntervalInteger)
        //timeInterval全体から整数のみを引いて小数だけを取り出す
    
    let decimalInteger = Int(decimal * 100)
        //小数の"0."を取り除くため、100倍して小数点以下を切り捨てる
    
    let minSec = String(format: "%02d:%02d%", min, sec)
        //まずmm:ssフォーマットにする
    
    let miliSec = String(format: "%02d", decimalInteger)
        //ミリ秒をffのフォーマットにする
    
    var str = minSec + "." + miliSec
    
    print(str)
    
[/code]

timeIntervalからわざわざ整数部分を引いた上でそれを１００倍してから`"%02d`のフォーマットで`"."`を足すというのはものすごい遠回りな気がします・・・。

`timeInterval`をタイマーで0.01秒ごとに１増える整数として扱えば計算は楽になるとは思うのですが、扱いたいものが再生中の曲の現在の再生時間（`currentPlaybackTime`）で、  
TimeInterval型で引き出しているので、少数 -> mm:ss.ffにしたいのです。


CC BY-SA 3.0
2017-09-18T05:47:32.467
38009
2017-09-18T09:34:19.070
2017-09-18T05:54:18.050
25183
25183
question
swift swift3
TimeInterval型からmm:ss.ffのString型への変換


最初にお断りしておきますが、これは、ご質問に直接お答えするものではありません。`TimeInterval`型の変数を、フォーマットされた文字列に変換するのは、わざわざプログラムを新規に作らなくても、既存のものの流用で行えますよ、という回答になります。

[code]

    // どこか（たとえばクラスのプロパティとして）にインスタンスformatterを保持。
    var formatter = DateFormatter()
    formatter.dateFormat = "mm:ss.SS"
    
    // フォーマットされた文字列に変換するプログラム。
    let timeInterval = 124.04521142
    let targetDate = Date(timeIntervalSinceReferenceDate: timeInterval)
    let str = formatter.string(from: targetDate)
    
[/code]

詳細は、`DateFormatter`クラス、`Date`クラスのリファレンスをご覧ください。


CC BY-SA 3.0
2017-09-18T09:34:19.070
38014
2017-09-18T09:34:19.070
18540
38009
answer