【Swift】透過 String 讓數值格式化呈現(整數補零、小數四捨五入至第幾位數)

Patty
彼得潘的 Swift iOS / Flutter App 開發教室
5 min readSep 13, 2021

控制呈現整數數字前面不足位數補零,或是控制小數數值在第幾位四捨五入。

動機

當設計碼錶的顯示 label 時發現數字的呈現不好看,希望分和秒的數字可以兩位數呈現不足則補零,於是乎開始研究關於數字格式化呈現。

時間數字的呈現不好看

整數前面不足補零

  • 字串格式表現整數符號 %d
  • 數字表示需要的字串寬度,不足以空白表示,例如:%2d
  • 0表示前面不足位數補零,例如:%02d
let minutes: Int = 8
let seconds: Int = 9
String(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 等都有更佳的使用方式。

--

--