【Swift】透過 String 讓數值格式化呈現(整數補零、小數四捨五入至第幾位數)
Published in
5 min readSep 13, 2021
控制呈現整數數字前面不足位數補零,或是控制小數數值在第幾位四捨五入。
動機
當設計碼錶的顯示 label 時發現數字的呈現不好看,希望分和秒的數字可以兩位數呈現不足則補零,於是乎開始研究關於數字格式化呈現。
整數前面不足補零
- 字串格式表現整數符號
%d
- 數字表示需要的字串寬度,不足以空白表示,例如:
%2d
- 0表示前面不足位數補零,例如:
%02d
let minutes: Int = 8
let seconds: Int = 9String(format: "%5d", minutes)
// 8(8前面包含四個空白位置,總共佔五個寬度)String(format: "%02d", minutes) //08
String(format: "%02d", seconds) //09
小數四捨五入
- 字串格式表現小數(浮點數)符號
%f
- 以
.n
表示第 n+1 位數字四捨五入至第 n 位數 - 備註:
如果需要比較精確數值 ( 多位小位數 ) 或是需要四捨五入的第 n 位數較大時,建議以 Double 型別儲存會較精確,不然可能導致四捨五入後的結果不如預期。
String(format: "%.2f", 3.19545) //3.20let doubleValue: Double = 5.5555555555
let floatValue: Float = 5.5555555555
String(format: "%.6f", doubleValue) //5.555556
String(format: "%.6f", floatValue) //5.555555
其他
- 字串中間可以包含其他文字等,不要在
%
和格式符號
之間。 - 字串內包含多個需要數值格式化呈現
String(format:arguments:)
,前面以多個字串格式表現符號,後面 Array 包含變數或常數。
String(format: "%02d:%02d", arguments: [minutes, seconds]) //08:09
效果呈現
分和秒終於可以表現兩位數且不足也補零,整個畫面設計比較美觀了。
其他應用
內建時鐘 App 的計時器分頁倒數計時數字顯示格式
- 當小時不為 0 的時候顯示 xx:xx:xx
- 當小時為 0 的時候顯示 xx:xx
func stringFromTimeInterval(interval: TimeInterval) -> String {
let time = Int(interval)
let seconds = time % 60
let minutes = (time / 60) % 60
let hours = (time / 3600)
return hours == 0 ? String(format: "%0.2d:%0.2d",minutes,seconds) : String(format: "%0.2d:%0.2d:%0.2d",hours,minutes,seconds)
}
參考
其他字串格式 String Format Specifiers
之後找時間研究補充,前一陣子 iOS 15 增加關於 format 的程式碼,似乎更方便不需要再特別記格式表現符號,對於使用日期、貨幣、小數、或是每個成員都是 string 的 array 等都有更佳的使用方式。