回答:
それはキャストではなく、フォーマットを持つ値から文字列を作成しています。
let a: Double = 1.5
let b: String = String(format: "%f", a)
print("b: \(b)") // b: 1.500000
異なるフォーマットで:
let c: String = String(format: "%.1f", a)
print("c: \(c)") // c: 1.5
format
書式設定が不要な場合は、プロパティを省略できます。
format:"%.1f" = 1 digit // 1.5
。format:"%.5f" = 5 digits // 1.50000
String(yourDouble)
。
let double = 1.5
let string = double.description
Xcode 7.1の更新•Swift 2.1:
これでDoubleもStringに変換できるので、好きなように使用できます。
let double = 1.5
let doubleString = String(double) // "1.5"
Swift 3以降では、拡張LosslessStringConvertible
して汎用にすることができます
Xcode 11.3•Swift 5.1以降
extension LosslessStringConvertible {
var string: String { .init(self) }
}
let double = 1.5
let string = double.string // "1.5"
固定数の小数桁の場合、FloatingPoint
プロトコルを拡張できます。
extension FloatingPoint {
func fixedFraction(digits: Int) -> String {
return String(format: "%.*f", digits, self as! CVarArg)
}
}
数値形式(最小および最大の小数桁数と丸めモード)をさらに制御する必要がある場合は、NumberFormatterを使用できます。
extension Formatter {
static let number = NumberFormatter()
}
extension FloatingPoint {
func fractionDigits(min: Int = 2, max: Int = 2, roundingMode: NumberFormatter.RoundingMode = .halfEven) -> String {
Formatter.number.minimumFractionDigits = min
Formatter.number.maximumFractionDigits = max
Formatter.number.roundingMode = roundingMode
Formatter.number.numberStyle = .decimal
return Formatter.number.string(for: self) ?? ""
}
}
2.12345.fractionDigits() // "2.12"
2.12345.fractionDigits(min: 3, max: 3, roundingMode: .up) // "2.124"
String(format: "%.\(digits)f", self as! CVarArg)
とString(format: "%.*f", digits, self as! CVarArg)
@Zaphの回答に加えて、以下を作成できます。 extension:
extension Double {
func toString() -> String {
return String(format: "%.1f",self)
}
}
使用法:
var a:Double = 1.5
println("output: \(a.toString())") // output: 1.5
a.toString()
ません。別の開発者がこのステートメントを見ると、WTFの瞬間が必ず発生します。
myToString()
して、そのカスタム定義を確実にするように変更できます。しかし、他の言語のように、プロトタイピングはコードの重複や適切なメンテナンスを回避することにつながります。
println("output: \(a.toString())")
とprintln("output: \(a)")
。2番目のオプションでは、コンパイルエラーは発生しません。このオプションは悪い習慣ですか?
yourDouble?.toString() ?? ""
Swift 4:次のコードを使用
let number = 2.4
let string = String(format: "%.2f", number)
この関数では、表示する小数点以下の桁数を指定できます。
func doubleToString(number:Double, numberOfDecimalPlaces:Int) -> String {
return String(format:"%."+numberOfDecimalPlaces.description+"f", number)
}
使用法:
let numberString = doubleToStringDecimalPlacesWithDouble(number: x, numberOfDecimalPlaces: 2)
String(format:"%."+numberOfDecimalPlaces.description+"f", number)
とString(format:"%.*f", numberOfDecimalPlaces, number)
ここには、さまざまな手法を提案する多くの答えがあります。ただし、UIで数値を表示するときは、必ずを使用しNumberFormatter
て、結果が適切にフォーマットされ、丸められ、ローカライズされるようにします。
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.5
小数点以下の桁数を固定したい場合(通貨値など)
let value = 10000.5
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
guard let string = formatter.string(for: value) else { return }
print(string) // 10,000.50
しかし、このアプローチの優れた点は、適切にローカライズされ、その結果10,000.50
、米国で10.000,50
はドイツになるということです。ロケールによって、数値の優先フォーマットが異なりますNumberFormatter
。UIで数値を表示する場合は、エンドユーザーが優先するフォーマットを使用する必要があります。
言うまでもなくNumberFormatter
、UI内で文字列表現を準備する際に不可欠ですが、永続ストレージ、Webサービスとのインターフェースなどの文字列として数値を書き込む場合は使用しないでください。
Swift 3では以下のように簡単です
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
私のために戻ります。
Swift 4では、UIでDoubleを変更してtextLabel "String"として使用する場合は、これをファイルの最後に追加できます。
extension Double {
func roundToInt() -> Int{
return Int(Darwin.round(self))
}
}
テキストラベルに入れたい場合は、次のように使用します。
currentTemp.text = "\(weatherData.tempCelsius.roundToInt())"
または、Intとして印刷します。
print(weatherData.tempCelsius.roundToInt())
私はNSNumberおよびNumberFormatterアプローチ(必要な場合)を好みます。また、拡張機能を使用してコードの肥大化を回避できます。
extension Double {
var toString: String {
return NSNumber(value: self).stringValue
}
}
Uは逆のアプローチも必要です
extension String {
var toDouble: Double {
return Double(self) ?? .nan
}
}
LossLessStringConvertible
ダブルを拡張する代わりに、より一般的な拡張プロトコルにすることもできます extension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5:次のコードを使用
extension Double {
func getStringValue(withFloatingPoints points: Int = 0) -> String {
let valDouble = modf(self)
let fractionalVal = (valDouble.1)
if fractionalVal > 0 {
return String(format: "%.*f", points, self)
}
return String(format: "%.0f", self)
}
}
String(format: "%.\(points)f", self)
とString(format: "%.*f", points, self)
var b = "\(a)"