Swift double to string


108

xCode 6을 업데이트하기 전에 double을 문자열로 캐스팅하는 데 문제가 없었지만 이제 오류가 발생합니다.

var a: Double = 1.5
var b: String = String(a)

"double is not convertible to string"이라는 오류 메시지가 표시됩니다. 다른 방법이 있습니까?


5
또한처럼 그것을 정의하는 것이 유용 할 수 있습니다var b = "\(a)"
erdekhayser

답변:


211

캐스팅이 아니라 형식이있는 값에서 문자열을 생성합니다.

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서식이 필요하지 않은 경우 속성을 생략 할 수도 있습니다 .


1
분수 숫자가 더 큰 double은 어떻습니까? 2.349343 줄 것이다 : (A, "% f를"형식)와 마찬가지로 = 2.34934340320이 stringValue = 문자열하자,
니코

1
디스플레이는 printf 형식 지정 옵션으로 제어 할 수 있습니다. 참조 : 문자열 형식 지정자printf (3) .
zaph

2
자릿수를 제어하려면 형식을 변경하기 만하면됩니다. format:"%.1f" = 1 digit // 1.5; format:"%.5f" = 5 digits // 1.50000
Megaetron 2015-07-09

3
답변을 업데이트하십시오. Swift 2.1에서는 String(yourDouble).
Alexandre G.

1
var 대신 let을 사용할 수 있습니다. 지금은 여러 번 부를 필요가 없습니다.
Oleksandr 2018

81
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"

1
이것이 해킹입니까, 아니면 합법적 인 방법입니까? 다른 iOS 버전에서 문제가 발생합니까?
Esqarrouth 2014

2
아니요, 다른 iOS 버전에서는 문제가 없습니다. OSX에서도 작동합니다. BTW 이것은 Double 또는 Int로 문자열 보간을 할 때 얻는 것입니다.
Leo Dabus 2014

굉장히 유용하다. % f와 같이 포맷 할 수 없습니다. Int에서도 작동하므로 두 가지 유형에 대해 한 가지 방법이 있습니다.
Patrik Vaberer 2015

0.00001에서는 작동하지 않으며 문자열로 "1e-05"가됩니다.
알렉스

교체 String(format: "%.\(digits)f", self as! CVarArg)String(format: "%.*f", digits, self as! CVarArg)
rmaddy

21

@Zaph 답변 외에도 다음을 만들 수 있습니다. extension:

extension Double {
    func toString() -> String {
        return String(format: "%.1f",self)
    }
}

용법:

var a:Double = 1.5
println("output: \(a.toString())")  // output: 1.5

1
@MaximShoustin OP에 투표 및 답변에 대한 충분한 담당자가 없습니다. 15 개가 필요합니다. 나는 또한 Extension을 만드는 것에 동의하지 않습니다. a.toString()다른 개발자가 다음과 같은 진술을 볼 때 분명히 WTF 순간이있을 것입니다.
zaph

1
@Zaph 왜 안돼. 확실히 당신은 몇 가지 접두사를 추가 myToString()하고 그것의 사용자 정의 정의를 확인 하기 위해 변경할 수 있습니다 . 그러나 다른 언어에서와 마찬가지로 프로토 타이핑은 코드 중복과 좋은 유지 관리를 방지합니다.
Maxim Shoustin 2014-08-16

@MaximShoustin 초보자 질문 : println("output: \(a.toString())")과 의 차이점은 무엇입니까 println("output: \(a)")? 두 번째 옵션은 컴파일 오류를 일으키지 않습니다. 이 옵션이 나쁜 습관입니까?
Alex Guerrero

빈 문자열을 반환하기 위해 Optional Double에서 작동하는 Double 또는 FloatingPoint에 이러한 확장을 작성하는 영리한 방법이 있습니까?
Kinergy

@KinergyyourDouble?.toString() ?? ""
Leo

11

Swift 3+ : 이 코드 라인을 사용해보십시오

let num: Double = 1.5

let str = String(format: "%.2f", num)

9

enum 값을 제외하고 신속하게 문자열을 만들려면 println () 메서드에서 수행하는 작업을 수행하십시오.

예를 들면 :

var stringOfDBL = "\(myDouble)"


3

이 함수를 사용하면 표시 할 소수 자릿수를 지정할 수 있습니다.

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)
rmaddy

3

여기에는 다양한 기술을 제안하는 많은 답변이 있습니다. 그러나 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 ​​내에서 숫자 값을 표시 할 때 최종 사용자가 선호하는 형식을 사용해야합니다.

말할 필요도없이 NumberFormatterUI 내에서 문자열 표현을 준비 할 때 필수적 이지만 숫자 값을 영구 저장, 웹 서비스와의 인터페이스 등을 위해 문자열로 쓰는 경우에는 사용해서는 안됩니다.


2
이것은 정답으로 표시되어야합니다
Asad Khan

2

신속한 3 :

var a: Double = 1.5
var b: String = String(a)

1

스위프트 3에서는 아래와 같이 간단합니다.

let stringDouble =  String(describing: double)

3
이것은 "Optional(6.1696108999999995)"나를 위해 예 를 들어 반환합니다 .
McSullivan D' Ander

0
var b = String(stringInterpolationSegment: a)

이것은 나를 위해 작동합니다. 시도해 볼 수 있습니다.


0

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())

0

NSNumber 및 NumberFormatter 접근 방식 (필요한 경우)을 선호하며 확장 코드를 사용하여 팽만감을 방지 할 수 있습니다.

extension Double {

   var toString: String {
      return NSNumber(value: self).stringValue
   }

}

U는 또한 역 접근이 필요할 수 있습니다.

extension String {

    var toDouble: Double {
        return Double(self) ?? .nan
    }

}

선택 사항을 반환하지만 nil이면 .nan을 할당하는 이유는 무엇입니까? 둘 중 하나를 수행해야합니다. 둘 다 아닙니다. Btw 문자열 이니셜 라이저를 사용하는 데 어떤 문제가 있습니까? 또한 확장이 더 일반적인 수 LossLessStringConvertible를 두 번 확장하는 대신 프로토콜 extension LosslessStringConvertible { var string: String { return .init(self) } }
레오 버스들이시길

U가 Double을 맞이하고 있습니까? 나는 이미 무기 호입니다 확인하고 NaN이 반환 이후 쓰레기가
주세페 Mazzilli

0

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)
rmaddy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.