質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

3533閲覧

Swift3 TimeInterval型からmm:ss.ffフォーマットのString型に

mitci

総合スコア37

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/09/18 06:05

###前提・実現したいこと
たとえばtimeInterval = 124.04521142という数値を
02:04.04というString型の値にしたいのです。

###該当のソースコード
以下のようなコードを書いてみましたが、
初心者ながらかなり冗長な気がします・・・

Swift

1var timeInterval = 124.04521142 2let min = timeInterval / 60 // -> 2(分) 3let sec = Int(timeInterval.truncatingRemainder(dividingBy: 60)) // -> 4(秒) 4 //mm:ssを割り出す 5 6let timeIntervalInteger = Int(timeInterval) 7let decimal = timeInterval - Double(timeIntervalInteger) //124.04521142 - 124.0 = 0.04521142 8 //timeInterval全体から整数のみを引いて小数だけを取り出す 9let decimalInteger = Int(decimal * 100) // -> 4 10 //decimalをString型にしたときの"0."を取り除くため、100倍してそれ以降の数字を切り捨てる 11let minSec = String(format: "%02d:%02d%", min, sec) // -> 02:04 12 13let miliSec = String(format: "%02d", decimalInteger) // -> 04 14 //ミリ秒をffのフォーマットにする 15 16var str = minSec + "." + miliSec // -> 02:04.04

まず小数点以下の数値をとるために、timeIntervalをInt型にして小数点以下を切り捨てた数値を出し、さらにそのあとにtimeIntervalから整数部分を引き、小数点以下のみの数値を出し、それをわざわざ100倍してまた少数点以下を切り捨て、%02dフォーマットで04にしたあとにmm:ss"."を足してそれらしくしています。

なんらかのフォーマットなどでもう少し単純化できないものかと思っています。

###試したこと
timerを使って0.01秒ごとに整数が1増えるという処理にすれば比較的簡単に扱えるとは思うのですが、
実際の場面で扱いたいのはMPMusicPlayerControllercurrentPlaybackTimeTimeInterval型であるため、できれば直接TimeInterval型からString型にしたいのです。

###補足情報(言語/FW/ツール等のバージョンなど)
Swift3 Xcode8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのやり方で問題ないですよ。普通のやり方です。

手を加えるなら、

minをInt型にする。(書き写す時に間違えた?)

swift

1let min = Int(timeInterval / 60) // -> 2(分)

全て一括にする

swift

1let str = String(format: "%02d:%02d.%02d", min, sec, decimalInteger)

たとえば

swift

1 2func timeString(time: TimeInterval) -> String { 3 ... 4}

のように関数にしておけばい意図が明確になっていいかもですね。


ズボラなやり方が好みなら

swift

1let t: TimeInterval = 124.04521142 2 3 4let f = DateFormatter() 5f.dateFormat = "mm:ss.SS" 6f.timeZone = TimeZone(secondsFromGMT: 0) 7 8let d = Date(timeIntervalSince1970: t) 9 10let s = f.string(from: d)

これでもできますが、こうする意味はあまりないかな?


追記

ちょっと補足です。

DateFormatterはあくまで日時/時刻を扱うクラスのため経過時間には使えない場合があります。
今回の場合は大丈夫ですが、経過時間が24時間を超えると使えなくなります。
時刻を表すもののため24時以降という考えがないためです。

なので、24時間を超える値を使いたい場合は結局質問者様が書いたようにする以外にないです。

投稿2017/09/18 09:32

編集2017/09/19 06:54
MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitci

2017/09/18 09:37

すいません、うっかりミス&もう少しだけ改良の余地はありましたが、 これでいいんですね…! ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問