1. 이전 포스팅 확인하기

 

https://growingsaja.tistory.com/940

 

 

 

 

 

2. 목표

 

    a. 글로벌 주요 환율 정보 제공 기능 구현 1 - 두나무 하나은행 활용

 

  예시 : https://quotation-api-cdn.dunamu.com/v1/forex/recent?codes=FRX.JPYUSD

[
    {
        "code": "FRX.JPYUSD",
        "currencyCode": "JPY",
        "currencyName": "엔",
        "country": "일본",
        "name": "일본 (USD/JPY100)",
        "date": "2023-08-02",
        "time": "12:50:45",
        "recurrenceCount": 376,
        "basePrice": 143.23,
        "openingPrice": 143.97,
        "highPrice": 143.97,
        "lowPrice": 142.12,
        "change": "FALL",
        "changePrice": 0.22,
        "cashBuyingPrice": 919.87,
        "cashSellingPrice": 888.23,
        "ttBuyingPrice": 895.20,
        "ttSellingPrice": 912.90,
        "tcBuyingPrice": null,
        "fcSellingPrice": null,
        "exchangeCommission": 2.0205,
        "usDollarRate": 0.0070,
        "high52wPrice": 151.86,
        "high52wDate": "2022-10-21",
        "low52wPrice": 127.23,
        "low52wDate": "2023-01-16",
        "currencyUnit": 100,
        "provider": "하나은행",
        "timestamp": 1690948259137,
        "id": 42,
        "createdAt": "2016-10-21T06:13:31.000+0000",
        "modifiedAt": "2023-08-02T03:50:59.000+0000",
        "changeRate": 0.0015336354,
        "signedChangePrice": -0.22,
        "signedChangeRate": -0.0015336354
    }
]

 

 

 

 

 

3. 참조 default 데이터

 

// vim default.json





// ...





    "serviceRecentRatesSetting": {
        "paymentCurrencyList": ["EUR", "JPY", "GBP", "CHF", "CAD", "AUD", "CNY", "HKD", "SEK", "NZD", "KRW", "SGD", "NOK", "MXN", "INR", "RUB", "ZAR", "TRY", "BRL", "AED", "BHD", "BND", "CNH", "CZK", "DKK", "IDR", "ILS", "MYR", "QAR", "SAR", "THB", "TWD", "CLP", "COP", "EGP", "HKD", "HUF", "KWD", "OMR", "PHP", "PLN", "PKR", "RON", "BRL", "BDT", "DZD", "ETB", "FJD", "JOD", "KES", "KHR", "KZT", "LKR", "LYD", "MMK", "MNT", "MOP", "NPR", "TZS", "UZS", "VND"]
    },






// ...

 

 

 

 

 

4. DunamuQuotation 구현

 

// vim DunamuQuotation.h

@interface DunamuQuotation : NSObject

// ****** 활용하게 될 krw 관련 주요 데이터 ****** //
// 최근 데이터 일시
@property (readwrite, strong, nonatomic) NSString *recentDateTime;
// 최근 데이터 환율
@property (readwrite, strong, nonatomic) NSString *usdkrw;
// 최근 데이터 거래 기준 화폐
@property (readwrite, strong, nonatomic) NSString *paymentCurrency;
// 시가
@property (readwrite, strong, nonatomic) NSString *openUsdkrw;
// 한국 기준 오늘의 변동가
@property (readwrite, strong, nonatomic) NSString *changeUsdkrw;
// 한국 기준 오늘의 변동률
@property (readwrite, strong, nonatomic) NSString *changePercentUsdkrw;
// 출처
@property (readwrite, strong, nonatomic) NSString *provider;

// ****** 활용하게 될 글로벌 관련 주요 데이터 ****** //
// 최신 여러 currency 환율
@property (readwrite, strong, nonatomic) NSMutableDictionary *ratesData;


+(instancetype)sharedInstance;
-(void)fetchDataWithCompletion;

@end
// vim DunamuQuotation.m

#import <Foundation/Foundation.h>
#import "DunamuQuotation.h"
// api 통신
#import "APIManager.h"
// 정보 가져오기
#import "DefaultLoader.h"

@implementation DunamuQuotation

+(instancetype)sharedInstance {
    
    static DunamuQuotation *sharedInstance = nil;
    static dispatch_once_t oneToken;
    dispatch_once(&oneToken, ^{
        sharedInstance = [[self alloc] init];
        sharedInstance.ratesData = [@{} mutableCopy];
        sharedInstance.ratesData[@"recentUsdRates"] = [@{} mutableCopy];
        sharedInstance.ratesData[@"recentOpenUsdRates"] = [@{} mutableCopy];
        sharedInstance.ratesData[@"recentUsdChange"] = [@{} mutableCopy];
        sharedInstance.ratesData[@"recentUsdChangePercent"] = [@{} mutableCopy];
        // krw 기본 정보
        sharedInstance.ratesData[@"country"] = [@{} mutableCopy];
        sharedInstance.ratesData[@"provider"] = [@{} mutableCopy];
        sharedInstance.ratesData[@"currencyName"] = [@{} mutableCopy];
        sharedInstance.ratesData[@"currencyUnit"] = [@{} mutableCopy];
        // krw 기준
        sharedInstance.ratesData[@"recentKrwRates"] = [@{} mutableCopy];
        // KRW api에서의 정보
        sharedInstance.ratesData[@"recentOpenKrwRates"] = [@{} mutableCopy];
        sharedInstance.ratesData[@"recentKrwChange"] = [@{} mutableCopy];
        sharedInstance.ratesData[@"recentKrwChangePercent"] = [@{} mutableCopy];
    });
    return sharedInstance;
}

// 매 1시간마다 업데이트되며, 00분 00초부터 00분 30초 사이에 업데이트된 수치가 노출됨
-(void)fetchDataWithCompletion {
    // **************************************** [Start] api 콜 준비 **************************************** //
    NSDictionary *dunamuQuotation = [DefaultLoader sharedInstance].ratesApi[@"DunamuQuotation"];
    NSArray *paymentCurrencyList = [DefaultLoader sharedInstance].serviceRecentRatesSetting[@"paymentCurrencyList"];
    APIManager* tryApiCall = [APIManager sharedInstance];
    /* #################### [Start] open exchange rates KRW 환율 데이터 가져오기 #################### */
    NSString *apiURL = dunamuQuotation[@"url"];
    // 1USD 당 몇KRW인지 알기 위한 url 조합
    apiURL = [apiURL stringByAppendingString:@"KRW"];
    apiURL = [apiURL stringByAppendingString:@"USD"];
    [tryApiCall fetchDataFromAPI:apiURL withCompletionHandler:^(NSDictionary *jsonResponse, NSError *error) {
        if (error) {
            NSLog(@"Error: %@", error.localizedDescription);
        } else {
            // 여기에서 jsonResponse를 가공 한 후 앱에서 사용하실 수 있습니다.
            if ([jsonResponse isKindOfClass:[NSDictionary class]]) {
                // error 발생한 경우 error, status, message라는 키값을 포함합니다.
                NSLog(@"[ERROR] DunamuQuotation status: %@, message: %@", jsonResponse[@"status"], jsonResponse[@"message"]);
            } else if ([jsonResponse isKindOfClass:[NSArray class]]) {
                // 정상 처리시, dictionary가 아니라 array입니다.
                if ([jsonResponse isEqual:@[]]) {
                    // 빈 array가 나오면 해당 api 비활성화 또는 잘못된 요청을 한 것입니다.
                    NSLog(@"[ERROR] DunamuQuotation empty array return.");
                } else {
                    // 정상 return으로 환율 정보 업데이트, 사용하기 편한 형태로 변경
                    NSDictionary *result = ((NSArray *)jsonResponse)[0];
                    // 최근 환율 업데이트 시간 정보
                    NSString *recentDateTime = [result[@"date"] stringByAppendingString:@" "];
                    recentDateTime = [recentDateTime stringByAppendingString:result[@"time"]];
                    self.recentDateTime = recentDateTime;
                    // 환율
                    float usdkrwFloat = [result[@"basePrice"] floatValue];
                    if (usdkrwFloat >= 10000) {
                        self.usdkrw = [NSString stringWithFormat:@"%.1f", usdkrwFloat];
                    } else if (usdkrwFloat >= 1000) {
                        self.usdkrw = [NSString stringWithFormat:@"%.2f", usdkrwFloat];
                    } else if (usdkrwFloat >= 100) {
                        self.usdkrw = [NSString stringWithFormat:@"%.3f", usdkrwFloat];
                    } else if (usdkrwFloat >= 10) {
                        self.usdkrw = [NSString stringWithFormat:@"%.4f", usdkrwFloat];
                    } else if (usdkrwFloat >= 1) {
                        self.usdkrw = [NSString stringWithFormat:@"%.5f", usdkrwFloat];
                    } else if (usdkrwFloat >= 0.1) {
                        self.usdkrw = [NSString stringWithFormat:@"%.6f", usdkrwFloat];
                    } else if (usdkrwFloat >= 0.01) {
                        self.usdkrw = [NSString stringWithFormat:@"%.7f", usdkrwFloat];
                    } else if (usdkrwFloat >= 0.001) {
                        self.usdkrw = [NSString stringWithFormat:@"%.8f", usdkrwFloat];
                    } else if (usdkrwFloat >= 0.0001) {
                        self.usdkrw = [NSString stringWithFormat:@"%.9f", usdkrwFloat];
                    } else {
                        self.usdkrw = [NSString stringWithFormat:@"%f", usdkrwFloat];
                    }
                    // 환율 변동가
                    self.changeUsdkrw = [NSString stringWithFormat:@"%@", result[@"signedChangePrice"]];
                    // 한국 환율 시가 = api에서 주는 openingPrice 정보를 사용하는게 아니라 "현재가-변동가"로 계산해서 사용합니다.
                    self.openUsdkrw = [NSString stringWithFormat:@"%.2f", [self.usdkrw floatValue] - [self.changeUsdkrw floatValue]];
                    // 환율 변동률 소수 2째자리수까지 반올림
                    self.changePercentUsdkrw = [NSString stringWithFormat:@"%.2f", [result[@"signedChangeRate"] floatValue] * 100];
                    // payment currency 추출해서 저장 : KRW, EUR 등
                    // ex. "name": "미국 (USD/KRW)" => 제일 뒤에 있는 문자 )를 삭제하고, / 기준으로 뒤쪽 string 가져오기
                    self.paymentCurrency = result[@"currencyUnit"];
                    // 데이터 출처
                    self.provider = result[@"provider"];
                    NSLog(@"[INFO] DunamuQuotation updated : %@ - %@", self.recentDateTime, self.usdkrw);
                    // api로 받은 데이터 깔끔한 dictionary로 가공하기
                }
            }
        }
    }];
    
    /* #################### [Start] open exchange rates global 환율 데이터 가져오기 #################### */
    for (NSString *paymentCurrency in paymentCurrencyList) {
        apiURL = dunamuQuotation[@"url"];
        // 1USD 당 몇{paymentCurrency}}인지 알기 위한 url 조합
        apiURL = [apiURL stringByAppendingString:paymentCurrency];
        apiURL = [apiURL stringByAppendingString:@"USD"];
        [tryApiCall fetchDataFromAPI:apiURL withCompletionHandler:^(NSDictionary *jsonResponse, NSError *error) {
            if (error) {
                NSLog(@"Error: %@", error.localizedDescription);
            } else {
                // 여기에서 jsonResponse를 가공 한 후 앱에서 사용하실 수 있습니다.
                if ([jsonResponse isKindOfClass:[NSDictionary class]]) {
                    // error 발생한 경우 error, status, message라는 키값을 포함합니다.
                    NSLog(@"[ERROR] DunamuQuotation USD status: %@, message: %@", jsonResponse[@"status"], jsonResponse[@"message"]);
                } else if ([jsonResponse isKindOfClass:[NSArray class]]) {
                    // 정상 처리시, dictionary가 아니라 array입니다.
                    if ([jsonResponse isEqual:@[]]) {
                        // 빈 array가 나오면 해당 화폐에 대한 정보를 api에서 제공하지 않는 것입니다. 해당 화폐 정보는 skip해줍니다.
                        NSLog(@"[ERROR] DunamuQuotation USD empty array return. %@", paymentCurrency);
                        self.ratesData[@"recentUsdRates"][paymentCurrency] = @"-";
                        self.ratesData[@"recentOpenUsdRates"][paymentCurrency] = @"-";
                        self.ratesData[@"recentUsdChange"][paymentCurrency] = @"-";
                        self.ratesData[@"recentUsdChangePercent"][paymentCurrency] = @"-";
                        self.ratesData[@"country"][paymentCurrency] = @"-";
                        self.ratesData[@"provider"][paymentCurrency] = @"-";
                        self.ratesData[@"currencyName"][paymentCurrency] = @"-";
                        self.ratesData[@"currencyUnit"][paymentCurrency] = @"-";
                        self.ratesData[@"recentKrwRates"][paymentCurrency] = @"-";
                    } else {
                        // 정상 return으로 환율 정보 업데이트, 사용하기 편한 형태로 변경
                        NSDictionary *result = ((NSArray *)jsonResponse)[0];
                        // 최근 환율 업데이트 시간 정보
                        NSString *recentDateTime = [result[@"date"] stringByAppendingString:@" "];
                        recentDateTime = [recentDateTime stringByAppendingString:result[@"time"]];
                        self.recentDateTime = recentDateTime;
                        // 환율
                        float usdRateFloat = [result[@"basePrice"] floatValue];
                        if (usdRateFloat >= 10000) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.1f", usdRateFloat];
                        } else if (usdRateFloat >= 1000) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.2f", usdRateFloat];
                        } else if (usdRateFloat >= 100) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.3f", usdRateFloat];
                        } else if (usdRateFloat >= 10) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.4f", usdRateFloat];
                        } else if (usdRateFloat >= 1) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.5f", usdRateFloat];
                        } else if (usdRateFloat >= 0.1) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.6f", usdRateFloat];
                        } else if (usdRateFloat >= 0.01) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.7f", usdRateFloat];
                        } else if (usdRateFloat >= 0.001) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.8f", usdRateFloat];
                        } else if (usdRateFloat >= 0.0001) {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.9f", usdRateFloat];
                        } else {
                            self.ratesData[@"recentUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%f", usdRateFloat];
                        }
                        // ****** 글로벌 각 화폐 환율 변동가 ****** //
                        self.ratesData[@"recentUsdChange"][paymentCurrency] = [NSString stringWithFormat:@"%@", result[@"signedChangePrice"]];
                        // 글로벌 각 화폐 환율 시가 = api에서 주는 openingPrice 정보를 사용하는게 아니라 "현재가-변동가"로 계산해서 사용합니다.
                        self.ratesData[@"recentOpenUsdRates"][paymentCurrency] = [NSString stringWithFormat:@"%.2f", usdRateFloat - [result[@"signedChangePrice"] floatValue]];
                        // ****** 글로벌 각 화폐 환율 변동률 소수 2째자리수까지 반올림 ****** //
                        self.ratesData[@"recentUsdChangePercent"][paymentCurrency] = [NSString stringWithFormat:@"%.2f", [result[@"signedChangeRate"] floatValue] * 100];
                        // ****** 글로벌 각 화폐의 국가 ****** //
                        if (result[@"country"] == [NSNull null]) {
                            NSString *currencyCode = result[@"currencyCode"];
                            if ([currencyCode isEqual:@"CNH"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"홍콩";
                            } else if ([currencyCode isEqual: @"CLP"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"칠레";
                            } else if ([currencyCode isEqual: @"COP"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"콜롬비아";
                            } else if ([currencyCode isEqual: @"OMR"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"오만";
                            } else if ([currencyCode isEqual: @"RON"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"루마니아";
                            } else if ([currencyCode isEqual: @"DZD"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"알제리";
                            } else if ([currencyCode isEqual: @"ETB"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"에티오피아";
                            } else if ([currencyCode isEqual: @"FJD"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"피지";
                            } else if ([currencyCode isEqual: @"KES"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"케냐";
                            } else if ([currencyCode isEqual: @"KHR"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"캄보디아";
                            } else if ([currencyCode isEqual: @"LKR"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"스리랑카";
                            } else if ([currencyCode isEqual: @"LYD"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"리비아";
                            } else if ([currencyCode isEqual: @"MMK"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"미얀마";
                            } else if ([currencyCode isEqual: @"MOP"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"마카오";
                            } else if ([currencyCode isEqual: @"NPR"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"네팔";
                            } else if ([currencyCode isEqual: @"TZS"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"탄자니아";
                            } else if ([currencyCode isEqual: @"UZS"]) {
                                self.ratesData[@"country"][paymentCurrency] = @"우즈베키스탄";
                            } else {
                                // 예외처리 목록에 없으면 currencyCode로 대체
                                self.ratesData[@"country"][paymentCurrency] = result[@"currencyCode"];
                            }
                        } else {
                            // data 있으면 그대로
                            if ([result[@"country"] isEqual:@"미국"]) {
                                // 한국 api라서 그런지, 한국KRW정보인데 미국이라고 나와서 수정 적용
                                self.ratesData[@"country"][paymentCurrency] = @"대한민국";
                            } else {
                                // 이외 api는 데이터 그대로 사용
                                self.ratesData[@"country"][paymentCurrency] = result[@"country"];
                            }
                        }
                        // ****** 데이터 출처 ****** //
                        if (result[@"provider"] == [NSNull null]) {
                            // 없으면 "-"
                            self.ratesData[@"provider"][paymentCurrency] = @"-";
                        } else {
                            // 있으면 있는거 가져오기
                            self.ratesData[@"provider"][paymentCurrency] = result[@"provider"];
                        }
                        // ****** 화폐 단위 한국어로 ****** //
                        if (result[@"currencyName"] == [NSNull null]) {
                            NSString *currencyCode = result[@"currencyCode"];
                            if ([currencyCode isEqual:@"CNH"]) {
                                self.ratesData[@"currencyName"][paymentCurrency] = @"위안";
                            } else if ([currencyCode isEqual: @"CLP"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"페소";
                           } else if ([currencyCode isEqual: @"COP"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"페소";
                           } else if ([currencyCode isEqual: @"OMR"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"리알";
                           } else if ([currencyCode isEqual: @"RON"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"레위";
                           } else if ([currencyCode isEqual: @"DZD"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"디나르";
                           } else if ([currencyCode isEqual: @"ETB"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"비르";
                           } else if ([currencyCode isEqual: @"FJD"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"달러";
                           } else if ([currencyCode isEqual: @"KES"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"실링";
                           } else if ([currencyCode isEqual: @"KHR"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"리얄";
                           } else if ([currencyCode isEqual: @"LKR"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"루피";
                           } else if ([currencyCode isEqual: @"LYD"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"디나르";
                           } else if ([currencyCode isEqual: @"MMK"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"키얏";
                           } else if ([currencyCode isEqual: @"MOP"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"파타카";
                           } else if ([currencyCode isEqual: @"NPR"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"루피";
                           } else if ([currencyCode isEqual: @"TZS"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"실링";
                           } else if ([currencyCode isEqual: @"UZS"]) {
                               self.ratesData[@"currencyName"][paymentCurrency] = @"솜";
                           } else {
                               // 예외처리 목록에 없으면 영어로 = CurrencyCode
                               self.ratesData[@"currencyName"][paymentCurrency] = result[@"currencyCode"];
                           }
                        } else {
                            // 있으면 그대로
                            self.ratesData[@"currencyName"][paymentCurrency] = result[@"currencyName"];
                        }
                    }
                }
            }
        }];
    }
    
    /* #################### [Start] open exchange rates KRW global 환율 데이터 가져오기 #################### */
    
    for (NSString *paymentCurrency in paymentCurrencyList) {
        if ([paymentCurrency isEqual:@"KRW"]) {
            // KRW는 api 미제공일뿐더러 이미 정보가 다 있어서 미진행
            self.ratesData[@"recentKrwRates"][@"KRW"] = @"1.00";
            self.ratesData[@"recentKrwChange"][@"KRW"] = @"0.00";
            self.ratesData[@"recentKrwChangePercent"][@"KRW"] = @"0.00";
            self.ratesData[@"recentOpenKrwRates"][@"KRW"] = @"1.00";
            self.ratesData[@"currencyUnit"][@"KRW"] = @1;
        } else {
            apiURL = dunamuQuotation[@"url"];
            // 1USD 당 몇{paymentCurrency}}인지 알기 위한 url 조합
            apiURL = [apiURL stringByAppendingString:@"KRW"];
            apiURL = [apiURL stringByAppendingString:paymentCurrency];
            [tryApiCall fetchDataFromAPI:apiURL withCompletionHandler:^(NSDictionary *jsonResponse, NSError *error) {
                if (error) {
                    NSLog(@"Error: %@", error.localizedDescription);
                } else {
                    // 여기에서 jsonResponse를 가공 한 후 앱에서 사용하실 수 있습니다.
                    if ([jsonResponse isKindOfClass:[NSDictionary class]]) {
                        // error 발생한 경우 error, status, message라는 키값을 포함합니다.
                        NSLog(@"[ERROR] DunamuQuotation KRW status: %@, message: %@", jsonResponse[@"status"], jsonResponse[@"message"]);
                    } else if ([jsonResponse isKindOfClass:[NSArray class]]) {
                        // 정상 처리시, dictionary가 아니라 array입니다.
                        if ([jsonResponse isEqual:@[]]) {
                            // 빈 array가 나오면 해당 화폐에 대한 정보를 api에서 제공하지 않는 것입니다. 해당 화폐 정보는 skip해줍니다.
                            NSLog(@"[ERROR] DunamuQuotation KRW empty array return. %@", paymentCurrency);
                            self.ratesData[@"recentKrwChange"][paymentCurrency] = @"-";
                            self.ratesData[@"recentKrwChangePercent"][paymentCurrency] = @"-";
                        } else {
                            // 정상 return으로 환율 정보 업데이트, 사용하기 편한 형태로 변경
                            NSDictionary *result = ((NSArray *)jsonResponse)[0];
                            // ****** 한국돈 환전시 최소 화폐 단위 ex. 100엔당 얼마원 ****** //
                            self.ratesData[@"currencyUnit"][paymentCurrency] = result[@"currencyUnit"];
                            // ****** 한국 화폐 원 기준의 환율 호가 정보 recentKrwRates ****** //
                            float krwRateFloat;
                            if ([result[@"basePrice"]  isEqual: @0] || result[@"basePrice"] == [NSNull null]) {
                                // 0이거나 존재하지 않으면 계산해서 구해보기
                                if ([result[@"cashBuyingPrice"] floatValue] == 0 && [result[@"cashSellingPrice"] floatValue] == 0) {
                                    // cash 관련 정보로 평균치 내서 도출
                                    krwRateFloat = ([result[@"cashBuyingPrice"] floatValue] + [result[@"cashSellingPrice"] floatValue]) / 2;
                                } else {
                                    // cash 정보 없으면 그냥 0 넣어주기
                                    krwRateFloat = [@0 floatValue];
                                }
                            } else {
                                // 정상인 경우
                                if ([paymentCurrency isEqual:@"KRW"]) {
                                    // 한국은 항상 1이기 때문에 예외처리
                                    self.ratesData[@"recentKrwRates"][paymentCurrency] = @"1.00";
                                } else {
                                    // 한국 이외 국가는 계속 변동되기 때문에 계산해서 저장
                                    krwRateFloat = [result[@"basePrice"] floatValue];
                                    // 해당 값을 size에 맞게 반올림해서 저장
                                    NSString *krwRateString;
                                    if (krwRateFloat >= 10000) {
                                        krwRateString = [NSString stringWithFormat:@"%.1f", krwRateFloat];
                                    } else if (krwRateFloat >= 1000) {
                                        krwRateString = [NSString stringWithFormat:@"%.2f", krwRateFloat];
                                    } else if (krwRateFloat >= 100) {
                                        krwRateString = [NSString stringWithFormat:@"%.3f", krwRateFloat];
                                    } else if (krwRateFloat >= 10) {
                                        krwRateString = [NSString stringWithFormat:@"%.4f", krwRateFloat];
                                    } else if (krwRateFloat >= 1) {
                                        krwRateString = [NSString stringWithFormat:@"%.5f", krwRateFloat];
                                    } else if (krwRateFloat >= 0.1) {
                                        krwRateString = [NSString stringWithFormat:@"%.6f", krwRateFloat];
                                    } else if (krwRateFloat >= 0.01) {
                                        krwRateString = [NSString stringWithFormat:@"%.7f", krwRateFloat];
                                    } else if (krwRateFloat >= 0.001) {
                                        krwRateString = [NSString stringWithFormat:@"%.8f", krwRateFloat];
                                    } else if (krwRateFloat >= 0.0001) {
                                        krwRateString = [NSString stringWithFormat:@"%.9f", krwRateFloat];
                                    } else {
                                        krwRateString = [NSString stringWithFormat:@"%f", krwRateFloat];
                                    }
                                    // String 값 저장
                                    self.ratesData[@"recentKrwRates"][paymentCurrency] = krwRateString;
                                }
                                
                            }
                            // ****** 글로벌 각 화폐 환율 시작가, 변동가, 변동률 ****** //
                            if (result[@"provider"] == [NSNull null] && [result[@"signedChangePrice"] isEqual:@0]) {
                                // krw 변동 정보는 추정치임! 왜나하면 과거의 환율 정보를 알 수 없기 때문에, 현재의 환율 정보로 역추산해서 오차가 발생할 수 밖에 없음
                                // ****** krw 기준 현재 환율 가져다쓰기 ****** //
                                float krwRateFloat = [result[@"basePrice"] floatValue];
                                // 해당 값을 size에 맞게 반올림해서 저장
                                NSString *krwRateString;
                                if (krwRateFloat >= 10000) {
                                    krwRateString = [NSString stringWithFormat:@"%.1f", krwRateFloat];
                                } else if (krwRateFloat >= 1000) {
                                    krwRateString = [NSString stringWithFormat:@"%.2f", krwRateFloat];
                                } else if (krwRateFloat >= 100) {
                                    krwRateString = [NSString stringWithFormat:@"%.3f", krwRateFloat];
                                } else if (krwRateFloat >= 10) {
                                    krwRateString = [NSString stringWithFormat:@"%.4f", krwRateFloat];
                                } else if (krwRateFloat >= 1) {
                                    krwRateString = [NSString stringWithFormat:@"%.5f", krwRateFloat];
                                } else if (krwRateFloat >= 0.1) {
                                    krwRateString = [NSString stringWithFormat:@"%.6f", krwRateFloat];
                                } else if (krwRateFloat >= 0.01) {
                                    krwRateString = [NSString stringWithFormat:@"%.7f", krwRateFloat];
                                } else if (krwRateFloat >= 0.001) {
                                    krwRateString = [NSString stringWithFormat:@"%.8f", krwRateFloat];
                                } else if (krwRateFloat >= 0.0001) {
                                    krwRateString = [NSString stringWithFormat:@"%.9f", krwRateFloat];
                                } else {
                                    krwRateString = [NSString stringWithFormat:@"%f", krwRateFloat];
                                }
                                // String 값 저장
                                self.ratesData[@"recentKrwRates"][paymentCurrency] = krwRateString;
                                
                                // ****** krw 기준 과거의 환율 구해서 krw 시작 가격을 usd로부터 역추산하기 ****** //
                                float recentOpenKrwRate = [self.openUsdkrw floatValue] / [self.ratesData[@"recentOpenUsdRates"][paymentCurrency] floatValue] * [result[@"currencyUnit"] floatValue];
                                // 해당 값을 size에 맞게 반올림해서 저장
                                if (krwRateFloat >= 10000) {
                                    krwRateString = [NSString stringWithFormat:@"%.1f", recentOpenKrwRate];
                                } else if (krwRateFloat >= 1000) {
                                    krwRateString = [NSString stringWithFormat:@"%.2f", recentOpenKrwRate];
                                } else if (krwRateFloat >= 100) {
                                    krwRateString = [NSString stringWithFormat:@"%.3f", recentOpenKrwRate];
                                } else if (krwRateFloat >= 10) {
                                    krwRateString = [NSString stringWithFormat:@"%.4f", recentOpenKrwRate];
                                } else if (krwRateFloat >= 1) {
                                    krwRateString = [NSString stringWithFormat:@"%.5f", recentOpenKrwRate];
                                } else if (krwRateFloat >= 0.1) {
                                    krwRateString = [NSString stringWithFormat:@"%.6f", recentOpenKrwRate];
                                } else if (krwRateFloat >= 0.01) {
                                    krwRateString = [NSString stringWithFormat:@"%.7f", recentOpenKrwRate];
                                } else if (krwRateFloat >= 0.001) {
                                    krwRateString = [NSString stringWithFormat:@"%.8f", recentOpenKrwRate];
                                } else if (krwRateFloat >= 0.0001) {
                                    krwRateString = [NSString stringWithFormat:@"%.9f", recentOpenKrwRate];
                                } else {
                                    krwRateString = [NSString stringWithFormat:@"%f", recentOpenKrwRate];
                                }
                                // String 값 저장
                                self.ratesData[@"recentOpenKrwRates"][paymentCurrency] = krwRateString;
                                
                                // ****** krw 기준 변동가 구하기 ****** //
                                float usdkrwChange = [result[@"basePrice"] floatValue] - recentOpenKrwRate;
                                self.ratesData[@"recentKrwChange"][paymentCurrency] = [NSString stringWithFormat:@"%.2f", usdkrwChange];
                                // ****** krw 기준 변동률 구하기 ****** //
                                float usdkrwChangePercent = usdkrwChange / recentOpenKrwRate * 100;
                                self.ratesData[@"recentKrwChangePercent"][paymentCurrency] = [NSString stringWithFormat:@"%.2f", usdkrwChangePercent];
                            } else {
                                // 이외의 경우 데이터 정상인 것이므로 그대로 사용
                                self.ratesData[@"recentKrwChange"][paymentCurrency] = [NSString stringWithFormat:@"%@", result[@"signedChangePrice"]];
                                self.ratesData[@"recentKrwChangePercent"][paymentCurrency] = [NSString stringWithFormat:@"%.2f", [result[@"signedChangeRate"] floatValue] * 100];
                                float recentOpenKrwRates = [result[@"basePrice"] floatValue] - [result[@"signedChangePrice"] floatValue];
                                self.ratesData[@"recentOpenKrwRates"][paymentCurrency] = [NSString stringWithFormat:@"%.2f", recentOpenKrwRates];
                            }
                        }
                    }
                }
            }];
        }
    }
}
@end

 

 

 

 

+ Recent posts