📋 Fomatter 란?
값을 다양한 텍스트 값으로 변환해 줄 수 있는 추상 타입이다.
class Formatter : NSObject
Foundation 에서 지원하는 Fomatter
포멧 | 설명 |
---|---|
ByteCountFormatter | 바이트값을 KB, MB, GB 등으로 변환해줌 |
DateFormatter | 날짜를 변환해줌. |
DateComponentsFormatter | "약 5분 남음" 같은 문자열을 만들어 반환해줌 |
DateIntervalFormatter | 시간 사이 간격을 문자로 반환해줌 |
MeasurementFormatter | 수치를 문자로 반환해줌 |
NumberFormatter | 숫자를 문자로 반환해줌 |
PersonNameComponentsFormatter | 사람의 이름을 정해진 규칙에 따라 반환해줌 |
이런 다양한 포메터들이 있다.
그리고 나만의 포메터를 만들어서 사용할 수도 있다.
custom fomatter
커스텀 해서 포메터를 만들어 보자.
위의 블로그 글을 참고해 보면 이모지 포멧터(:-) → 😀) 를 만드는 방법이 나와있다.
🎲 NumberFomatter
class NumberFormatter : Formatter
숫자 값과 텍스트 표현 사이를 변환하는 포맷터이다.
형식 선택하기
넘버 포메터의 인스턴스 생성하고 형식 설정해 주기
var numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .decimal
이렇게 다양한 형식들이 있다.
🗒 decimal
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .decimal
let number = 178500
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
//178,500
🤑 currency
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .currency
let number = -12300000
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
//-$12,300,000.00
numberFomatter.locale = Locale(identifier: "ko_KR")
let result2 = numberFomatter.string(from: number as NSNumber)
print(result2 ?? "")
//-₩12,300,000
🤑 currencyAccounting
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .currencyAccounting
let number = -12300000
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
//($12,300,000.00)
numberFomatter.locale = Locale(identifier: "ko_KR")
let result2 = numberFomatter.string(from: number as NSNumber)
print(result2 ?? "")
//(₩12,300,000)let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .currency
let number = -12300000
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
numberFomatter.locale = Locale(identifier: "ko_KR")
let result2 = numberFomatter.string(from: number as NSNumber)
print(result2 ?? "")
🤑 currencyISOCode
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .currencyISOCode
let number = 123
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
//USD 123.00
numberFomatter.locale = Locale(identifier: "ko_KR")
let result2 = numberFomatter.string(from: number as NSNumber)
print(result2 ?? "")
//KRW 123
🤑 currencyPlural
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .currencyPlural
let number = 123
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
//123.00 US dollars
numberFomatter.locale = Locale(identifier: "ko_KR")
let result2 = numberFomatter.string(from: number as NSNumber)
print(result2 ?? "")
//123 대한민국 원
🎲 none : Int 스타일로 표기된다.
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .none
let number = 123.0123
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
//123
💽 ordinal
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .ordinal
let number = 123
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
//123rd
🍕 percent
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .percent
let number = 123.01
let result = numberFomatter.string(from: number as NSNumber)
print(result)
//20%
🧪 scientific
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .scientific
let number = 123
let result = numberFomatter.string(from: number as NSNumber)
print(result ?? "")
//1.23E2
🗣 spellOut
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .spellOut
let number = 123.01
let result = numberFomatter.string(from: number as NSNumber)
print(result)
//"one hundred twenty-three point zero one"
로컬 identitier 찾을 때 참고 할 만한 페이지
Significant Digits and Fraction Digits
이것으로 수를 얼마나 보여줄 것인지 지정할 수 있다.
그런데... 우리가 일반적으로 아는 소수점 3자리수 까지 나타내줘! 랑은 뭔가 약간 핀트가 다르다.
여기서는 0은 자리수로 따지지 않기 때문이다.
Significant Digit : 수 전체를 의미한다.
Integer Digit : 수의 정수 부분을 의미한다.
fraction Digit : 수의 소수 부분을 의미한다.
Number Fomattter 클래스 에서는 0 이 아닌 숫자 (유효 숫자) 가 얼마나 표시 될지를 나타내 줄 수 있다.
사실 왜 자리수가 아니라 유효 숫자를 표현하는지 정확히는 모르겠다.
공대생들의 이야기로는 시험을 볼때도 유효 숫자 몇자리까지 써라 라고 내준다고 하니 많이 이용하고 있는 개념 인 것 같기는 하다. 🥹 이에 대한 의견이 있으시면 댓글에 꼭 알려 주세요!
usesSignificantDigits
numberFomatter.usesSignificantDigits = **true**
이것을 true 로 설정해 주면, digit 관련 옵션들을 받아들이고
false 이면 무시한다.
그런데 내가 실험해본 결과로는 false 로 해도 무시하지 않았다. 😅
공식 문서엔 분명 무시 한다고 써 있었는데????
줄 수 있는 옵션의 종류
- maximumSignificantDigits
- minimumSignificantDigits
- maximumIntegerDigits
- minimumIntegerDigits
- maximumFractionDigits
- minimumFractionDigits
let numberFomatter = NumberFormatter() numberFomatter.numberStyle = .decimal numberFomatter.usesSignificantDigits = true numberFomatter.maximumSignificantDigits = 3 let number = 12341234 let result = numberFomatter.string(from: number as NSNumber) print(result ?? "") //12,300,000
let numberFomatter = NumberFormatter() numberFomatter.numberStyle = .decimal numberFomatter.usesSignificantDigits = true numberFomatter.maximumIntegerDigits = 2 numberFomatter.maximumFractionDigits = 3 let number = 123.0178934 let result = numberFomatter.string(from: number as NSNumber) print(result ?? "")
- 사용예시
자리수 제한하기
위의 기능을 제공하지만, 사실은 0을 포함한 자리수를 자르는 기능이 더 유용할 것 같다.
numberFomatter.positiveFormat = "##0.00##"
numberFomatter.negativeFormat = "minus ##0.00##"
위와 같이 format 을 설정해 주면 된다.
"0"은 꼭 있어야 하는 자리수를 나타낸다.
"#"은 있으면 나타나고 없으면 없어지는 자리수를 나타낸다.
let numberFomatter = NumberFormatter()
numberFomatter.numberStyle = .decimal
numberFomatter.positiveFormat = "##,##0.00##"
numberFomatter.negativeFormat = "minus #,###0.00##"
let number1 = -1234.0
let number2 = 634927490.989898
let result1 = numberFomatter.string(from: number1 as NSNumber)
let result2 = numberFomatter.string(from: number2 as NSNumber)
print(result1 ?? "")
print(result2 ?? "")
//minus 1,234.00
//634,927,490.9899
참고자료
'🍎 iOS > 🕊️ swift' 카테고리의 다른 글
[swift] 부동 소수점 오류가 나는 이유 (0) | 2023.01.06 |
---|---|
[swift] 고차 함수 요목조목 보기 (0) | 2023.01.06 |
[swift] Subscript 구현하기 (0) | 2023.01.06 |
[swift] String.Index 는 무엇일까? (0) | 2023.01.06 |
[swift] Substring는 왜 있는 걸까? (0) | 2023.01.06 |