Swiftにおける数字と文字の変換について
基本的には Int(), String(), Double() のキャストです
Int, String, Double 変換
数字文字変換はいつも悩むところですので整理しておきました。
1. Int -> String
2. String -> Int
3. Double -> String
4. String -> Double
5. Int <-> Double
6. Float <-> Double
Int -> String
整数の Int型 から文字列の String型 への変換です
String()、descriptionが使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// String() let num1:Int = 86 let sNum1:String = String(num1) print(sNum1) // --> 86 // description let num2:Int = 65 let sNum2:String = num2.description print(sNum2) // --> 65 let num3:Int = 39 let sNum3:String = "\(num3)" print(sNum3) // --> 39 |
ここで一応Int型にはビット数が異なるタイプや符号つき、符号なしがあります。
これらの変換もIntと同じですが数値範囲を考慮する必要があります。
またIntは実行環境によって32ビット環境ではInt32、64ビットInt64と同じになります。
- Int8:-128 〜 127
- Int16: -32768 〜 32767
- Int32: -2147483648 〜 2147483647
- Int64: -9223372036854775808 〜 9223372036854775807
- UInt8: 0 〜 255
- UInt16: 0 〜 65535
- UInt32: 0 〜 4294967295
- UInt64: 0 〜 18446744073709551615
結局これらの変換は同じですが
ビット数や符号による範囲外にはできないので注意しておきましょう。
また、これらの数値は以下のようにmax、minを使って調べられます。
1 2 3 4 5 |
let maxI8: Int8 = Int8.max print(maxI8) // --> 127 let minI8: Int8 = Int8.min print(minI8) // --> -128 |
String -> Int
文字列 String型 から整数 Int型 への変換
Int() でキャストしますが、Stringなので数字ではない場合もあるので注意が必要
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// Int() let str1:String = "94" let nStr1:Int = Int(str1)! print(nStr1) // --> 94 // 数字に変換できない文字列 let str2:String = "98abc" // これは nil となる let nStr2 = Int(str2) print(nStr2 as Any) // --> nil // if, guard などを使って切り分ける let str3:String = "108abc" if let nStr3 = Int(str3){ print(nStr3) } else{ print("error") } // NumberFormatter let str4 = "78" let nStr4 = NumberFormatter().number(from: str4) as! Int print(nStr4) // --> 0.78 |
Double -> String
浮動小数点 Double型 から文字の String型への変換
こちらもString()、descriptionが使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// String() let num3:Double = 86.87 let sNum3:String = String(num3) print(sNum3) // --> 86.87 // description let num4:Double = 65.989 let sNum4:String = num4.description print(sNum4) // --> 65.989 let num5:Double = 8.001 let sNum5:String = "\(num5)" print(sNum5) // --> 8.001 |
String -> Double
文字列の String型 から浮動小数点の Double型 への変換
Double()、Darwin.atof()が使えます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// Double() let str1:String = "94.765" let nStr1:Double = Double(str1)! print(nStr1) // --> 94.765 // Darwin.atof let str2:String = "10.59" let nStr2:Double = atof(str2) print(nStr2) // --> 10.59 // if, guard などを使って切り分ける let str3:String = "108.32abc" if let nStr3 = Int(str3){ print(nStr3) } else{ print("error") // --> error } // NumberFormatter let str4 = "0.78" let nStr4 = NumberFormatter().number(from: str4) as! Double print(nStr4) // --> 78 |
Int <-> Double
整数の Int型 から浮動小数点の Double型 への変換
1 2 3 4 5 6 7 8 9 10 11 12 |
// Double から Int let dNum1:Double = 3.14 let iNum1:Int = Int(dNum1) print(iNum1) // --> 3 、丸められる // Int から Double let iNum2:Int = 37 let dNum2:Double = Double(iNum2) print(dNum2) // --> 37.0 |
Float <-> Double
浮動小数点どうしなのですが、あえてここでは浮動小数点による違い、誤差がでるので気をつけないといけないということです。
工学的には誤差が小さいので無視できると言えますが、銀行などのお金を扱う場合は困ります。
1 2 3 4 5 6 7 8 9 10 |
let fNum1:Float = 3.14 let dNum1:Double = Double(fNum1) print(dNum1) // --> 3.140000104904175 let dNum2:Double = 37.98 let fNum2:Float = Float(dNum2) print(fNum2) // --> 37.98 |
FloatからDoubleに変換すると誤差がでますが、DoubleをFloatに変換すると誤差はでません。ところがFloat80にすると誤差がでます。
これは有限桁数の2進数によって計算すると,丸め誤差がでるからです。これを回避するためには数値を文字列として扱うか、NSDecimalNumberを使う必要があります。
関連ページ:
- Playground で Swift を使う
- Swiftの変数・定数・型の設定
- Swift 演算子
- Int, String, Double 変換
- String 文字列分割