답변:
캐스팅이 아니라 형식이있는 값에서 문자열을 생성합니다.
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)")
? 두 번째 옵션은 컴파일 오류를 일으키지 않습니다. 이 옵션이 나쁜 습관입니까?
yourDouble?.toString() ?? ""
Swift 3+ : 이 코드 라인을 사용해보십시오
let num: Double = 1.5
let str = String(format: "%.2f", num)
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에 숫자를 표시 할 때 항상 a를 사용 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 내에서 문자열 표현을 준비 할 때 필수적 이지만 숫자 값을 영구 저장, 웹 서비스와의 인터페이스 등을 위해 문자열로 쓰는 경우에는 사용해서는 안됩니다.
스위프트 3에서는 아래와 같이 간단합니다.
let stringDouble = String(describing: double)
"Optional(6.1696108999999995)"
나를 위해 예 를 들어 반환합니다 .
var b = String(stringInterpolationSegment: a)
이것은 나를 위해 작동합니다. 시도해 볼 수 있습니다.
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)"