빠른 언어로 BMI 프로그램을 작성하려고합니다. 그리고이 문제가 있습니다 : String을 Double로 변환하는 방법?
Objective-C에서 다음과 같이 할 수 있습니다.
double myDouble = [myString doubleValue];
그러나 어떻게 스위프트 언어로 이것을 달성 할 수 있습니까?
답변
스위프트 4.2 + 문자열을 두 배로
새 유형 이니셜 라이저를 사용하여 문자열과 숫자 유형 (Double, Float, Int)을 변환해야합니다. 올바른 값을 갖는 선택적 유형 (Double?)을 반환하거나 문자열이 숫자가 아닌 경우 nil을 반환합니다.
참고 : NSString doubleValue 속성은 값을 변환 할 수없는 경우 0을 반환하므로 권장되지 않습니다 (예 : 잘못된 사용자 입력).
let lessPrecisePI = Float("3.14")
let morePrecisePI = Double("3.1415926536")
let invalidNumber = Float("alphabet") // nil, not a valid number
if / let을 사용하여 값을 풀어서 사용하십시오.
if let cost = Double(textField.text!) {
print("The user entered a value price of \(cost)")
} else {
print("Not a valid number: \(textField.text!)")
}
NumberFormatter
클래스를 사용하여 형식이 지정된 숫자와 통화를 변환 할 수 있습니다 .
let formatter = NumberFormatter()
formatter.locale = Locale.current // USA: Locale(identifier: "en_US")
formatter.numberStyle = .decimal
let number = formatter.number(from: "9,999.99")
통화 형식
let usLocale = Locale(identifier: "en_US")
let frenchLocale = Locale(identifier: "fr_FR")
let germanLocale = Locale(identifier: "de_DE")
let englishUKLocale = Locale(identifier: "en_GB") // United Kingdom
formatter.numberStyle = .currency
formatter.locale = usLocale
let usCurrency = formatter.number(from: "$9,999.99")
formatter.locale = frenchLocale
let frenchCurrency = formatter.number(from: "9999,99€")
// Note: "9 999,99€" fails with grouping separator
// Note: "9999,99 €" fails with a space before the €
formatter.locale = germanLocale
let germanCurrency = formatter.number(from: "9999,99€")
// Note: "9.999,99€" fails with grouping separator
formatter.locale = englishUKLocale
let englishUKCurrency = formatter.number(from: "£9,999.99")
String을 Double 형식 (및 통화)으로 변환하는 방법 에 대한 내 블로그 게시물 에서 자세한 내용을 읽으십시오 .
답변
스위프트 2 업데이트
가 많은 답변이 언급 한대로가 아닌 숫자 값에 0을 반환하기 때문에,있는 NSString의 두 배 값이 매우 안전하지 않습니다 (더 관용적하고 안전한 방법으로이 작업을 수행 할 수 있도록 새로운 failable 이니셜이 수단.있는 그 doubleValue
의 "foo"
와 "0"
있습니다 똑같다.)
let myDouble = Double(myString)
이것은 선택 사항을 반환하므로 0을 반환 한 "foo"
위치를 전달하는 경우 doubleValue
실패 가능한 초기화 프로그램이 반환 nil
됩니다. 당신은을 사용할 수 있습니다 guard
, if-let
또는 map
을 처리하는Optional<Double>
Original Post :
승인 된 제안과 같이 NSString 생성자를 사용할 필요는 없습니다. 다음과 같이 간단히 브리지 할 수 있습니다.
(swiftString as NSString).doubleValue
답변
좀 더 스위프트 느낌의 경우을 사용 NSFormatter()
하면 캐스팅을 피하고 문자열에 값이 포함되지 않은 경우 NSString
반환 합니다 (예 : “test”는 반환되지 않음 ).nil
Double
0.0
let double = NSNumberFormatter().numberFromString(myString)?.doubleValue
또는 Swift의 String
유형을 확장하십시오 .
extension String {
func toDouble() -> Double? {
return NumberFormatter().number(from: self)?.doubleValue
}
}
그것을 다음과 같이 사용하십시오 toInt()
:
var myString = "4.2"
var myDouble = myString.toDouble()
Double?
래핑되지 않은 옵션 을 반환합니다 .
강제 랩핑 해제 중 하나 :
println("The value is \(myDouble!)") // prints: The value is 4.2
또는 if let 문으로 :
if let myDouble = myDouble {
println("The value is \(myDouble)") // prints: The value is 4.2
}
업데이트 :
지역화의 경우 다음과 같이 NSFormatter에 로케일을 적용하는 것이 매우 쉽습니다.
let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "fr_FR")
let double = formatter.numberFromString("100,25")
마지막으로 NSNumberFormatterCurrencyStyle
문자열에 통화 기호가 포함 된 통화로 작업하는 경우 포맷터에서 사용할 수 있습니다 .
답변
여기 또 다른 옵션은 이것을로 변환 NSString
하고 사용하는 것입니다.
let string = NSString(string: mySwiftString)
string.doubleValue
답변
다음은 Swift 문자열에서 doubleValue ()를 호출하고 double back을 얻는 확장 메소드입니다 (예제 출력 우선)
println("543.29".doubleValue())
println("543".doubleValue())
println(".29".doubleValue())
println("0.29".doubleValue())
println("-543.29".doubleValue())
println("-543".doubleValue())
println("-.29".doubleValue())
println("-0.29".doubleValue())
//prints
543.29
543.0
0.29
0.29
-543.29
-543.0
-0.29
-0.29
확장 방법은 다음과 같습니다.
extension String {
func doubleValue() -> Double
{
let minusAscii: UInt8 = 45
let dotAscii: UInt8 = 46
let zeroAscii: UInt8 = 48
var res = 0.0
let ascii = self.utf8
var whole = [Double]()
var current = ascii.startIndex
let negative = current != ascii.endIndex && ascii[current] == minusAscii
if (negative)
{
current = current.successor()
}
while current != ascii.endIndex && ascii[current] != dotAscii
{
whole.append(Double(ascii[current] - zeroAscii))
current = current.successor()
}
//whole number
var factor: Double = 1
for var i = countElements(whole) - 1; i >= 0; i--
{
res += Double(whole[i]) * factor
factor *= 10
}
//mantissa
if current != ascii.endIndex
{
factor = 0.1
current = current.successor()
while current != ascii.endIndex
{
res += Double(ascii[current] - zeroAscii) * factor
factor *= 0.1
current = current.successor()
}
}
if (negative)
{
res *= -1;
}
return res
}
}
오류 검사는 없지만 필요한 경우 추가 할 수 있습니다.
답변
스위프트 1.1 직접 전달할 수 있습니다 String
에 const char *
매개 변수입니다.
import Foundation
let str = "123.4567"
let num = atof(str) // -> 123.4567
atof("123.4567fubar") // -> 123.4567
더 이상 사용되지 않으려면 atof
:
strtod("765.4321", nil) // -> 765.4321
한 가지주의 사항 : 변환 동작은과 다릅니다 NSString.doubleValue
.
atof
및 strtod
동의를 0x
앞에 둔 16 진수 문자열을 :
atof("0xffp-2") // -> 63.75
atof("12.3456e+2") // -> 1,234.56
atof("nan") // -> (not a number)
atof("inf") // -> (+infinity)
.doubleValue
행동 을 선호하는 경우 CFString
브리징을 계속 사용할 수 있습니다 .
let str = "0xff"
atof(str) // -> 255.0
strtod(str, nil) // -> 255.0
CFStringGetDoubleValue(str) // -> 0.0
(str as NSString).doubleValue // -> 0.0
답변
Swift 2.0에서 가장 좋은 방법은 Objective-C 개발자처럼 생각하지 않는 것입니다. 따라서 “String을 Double로 변환”하지 말고 “String에서 Double을 초기화”해야합니다. 여기 Apple 문서 :
https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_
선택적인 init이므로 nil 통합 연산자 (??)를 사용하여 기본값을 설정할 수 있습니다. 예:
let myDouble = Double("1.1") ?? 0.0