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