Red(레드)
RED BITES APPLE
Red(레드)
전체 방문자
오늘
어제
  • 분류 전체보기 (22)
    • 🍎 iOS (20)
      • 🕊️ swift (9)
      • ⌨️ xcode (1)
      • 🍏 UIKit (7)
      • 🍑 SwiftUI (0)
      • 🧑🏻‍💻 WWDC (3)
    • 🖥️ CS (1)
    • 📘 용어 사전 (1)
    • TIL (0)

블로그 메뉴

  • POST
  • Git Hub

공지사항

인기 글

태그

  • til
  • meta

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Red(레드)

RED BITES APPLE

[iOS] Number Fomatter
🍎 iOS/🕊️ swift

[iOS] Number Fomatter

2023. 1. 6. 01:29

📋 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

참고자료

애플 공식 문서 Fomatter

애플 공식 문서 NumberFomatter

넘버 포멧터의 다양한 예시

커스텀 포메터 공식 문서

커스텀 포메터 튜토리얼

'🍎 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

    티스토리툴바