투케이2K

72. (swift/xcode) [유틸 파일] Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시 - 소수점 제한 출력 본문

Swift

72. (swift/xcode) [유틸 파일] Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시 - 소수점 제한 출력

투케이2K 2022. 4. 6. 10:37

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

[소스 코드]

    // MARK: - [Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]
    func doubleCutLength(double: Double, length: Int) -> String {
        
        /*
        // -----------------------------------------
        [doubleCutLength 메소드 설명]
        // -----------------------------------------
        1. Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시
        // -----------------------------------------
        2. 호출 방법 :
         C_Util().doubleCutLength(double: 123.4567, length: 2)
         C_Util().doubleCutLength(double: -123.4567, length: 2)
        // -----------------------------------------
        3. 리턴 반환 : 123.45 : 소수점 특정 자릿수 기준 제한 문자열 데이터
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        
        // [인풋 데이터 널 체크 수행 실시]
        if double != nil
            
            && length != nil
            && length >= 0 {
            
            
            // [인풋으로 들어온 double 데이터 확인 실시]
            var strData = String(describing: double)
            var strArray = Array(strData)
            
            
            // [마이너스 값 체크 여부 플래스 정의]
            var checkMinus = false
            
            
            // [마이너스 데이터 값 체크 실시]
            if strArray[0] == "-" {
                checkMinus = true // [마이너스 시작 플래스 설정]
            }
            
            
            // [마이너스로 시작하는 경우]
            if checkMinus == true {
                strArray.remove(at: 0)
            }
            
            
            // [배열 데이터 값을 string 변환 실시]
            strData = ""
            for j in stride(from: 0, through: strArray.count-1, by: 1) {
                strData = strData + strArray[j].description
            }
            
            
            // [for 문을 돌면서 . 점 개수 카운트 및 위치 확인 실시]
            var dotCount = 0
            var dotLocation = 0
            var dotLength = 0
            for i in stride(from: 0, through: strArray.count-1, by: 1) {
                if strArray[i] == "." {
                    dotCount = dotCount + 1 // [. 점 개수 카운트 증가]
                    dotLocation = i // [점 위치값 지정 실시]
                    dotLength = strArray.count - (i + 1) // [소수점 이하 자리수 카운트 개수 확인]
                }
            }
            /*
            print("")
            print("====================================")
            print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
            print("-------------------------------")
            print("checkMinus [마이너스 값 여부] :: \(checkMinus)")
            print("-------------------------------")
            print("dotCount [점 개수] :: \(dotCount)")
            print("-------------------------------")
            print("dotLocation [점 위치] :: \(dotLocation)")
            print("-------------------------------")
            print("formatStrData [포맷 데이터] :: \(strData)")
            print("====================================")
            print("")
            // */
            
            
            // [점 개수 값을 확인해서 포맷 수행 실시]
            if dotCount == 1 {
                // [위치 값 재조절 실시]
                dotLocation = dotLocation + length
                
                
                // [NumberFomatter 을 사용해서 특정 자릿수 기준으로 포맷 실시]
                let numberFomatter = NumberFormatter() // NumberFormatter 객체 생성
                numberFomatter.roundingMode = .floor // 특정 자릿수 기준으로 버림 설정
                numberFomatter.maximumSignificantDigits = dotLocation  // 자르기를 원하는 자릿수 지정 실시
                
                
                // [리턴 결과 변수에 삽입 실시]
                returnData = numberFomatter.string(for: Double(strData) ?? 0)!
                if checkMinus == true { // 마이너스 기호인 경우 최종 부호 추가
                    returnData = "-" + returnData
                }
                
                
                // [원본 데이터보다 더 많은 수 자리를 지정한 경우 0 으로 채움]
                /*
                print("")
                print("====================================")
                print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
                print("-------------------------------")
                print("소수점 이하 개수 :: \(dotLength)")
                print("-------------------------------")
                print("자르려는 소수점 자릿수 :: \(length)")
                print("====================================")
                print("")
                // */
                if length > dotLength {
                    let zeroCount = length - dotLength
                    for k in stride(from: 0, through: zeroCount-1, by: 1){
                        returnData = returnData + "0"
                    }
                }
            }
        }
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
        print("-------------------------------")
        print("input [double] :: \(double)")
        print("-------------------------------")
        print("input [length] :: \(length)")
        print("-------------------------------")
        print("return [string] :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
 

[결과 출력]

 

 

반응형
Comments