Skip to content

Commit f8fa1e7

Browse files
committed
Store price to BigDecimal
1 parent f8508d6 commit f8fa1e7

File tree

5 files changed

+57
-7
lines changed

5 files changed

+57
-7
lines changed

gdx-pay-android-amazon/src/com/badlogic/gdx/pay/android/amazon/AmazonTransactionUtils.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.badlogic.gdx.pay.PurchaseManagerConfig;
2525
import com.badlogic.gdx.pay.Transaction;
2626

27+
import java.math.BigDecimal;
2728
import java.text.NumberFormat;
2829
import java.text.ParseException;
2930

@@ -73,14 +74,16 @@ static Transaction convertReceiptToTransaction(int i, String requestId, Receipt
7374
static Information convertProductToInformation(Product product) {
7475

7576
String priceString = product.getPrice();
76-
Float priceAsFloat = tryParsePrice(priceString);
77+
Float priceAsFloat = tryParsePriceToFloat(priceString);
78+
BigDecimal priceAsBigDecimal = tryParsePriceToBigDecimal(priceString);
7779
return Information.newBuilder()
7880
.localName(product.getTitle())
7981
.localDescription(product.getDescription())
8082
.localPricing(priceString)
8183
.priceCurrencyCode(tryParseCurrency(priceString))
8284
.priceInCents(convertToPriceInCents(priceAsFloat))
8385
.priceAsDouble(priceAsFloat == null ? null : priceAsFloat.doubleValue())
86+
.priceAsBigDecimal(priceAsBigDecimal)
8487
.build();
8588
}
8689

@@ -106,16 +109,36 @@ static Integer convertToPriceInCents(Float priceAsFloat) {
106109
private static Float tryParsePrice(String priceString) {
107110
if (priceString == null || priceString.length() == 0)
108111
return null;
109-
try {
110-
// Remove currency from string
111-
// The ugly way
112-
priceString = priceString.substring(1);
113112

114-
// Remaining should be parseable
113+
// Remove currency from string
114+
// The ugly way
115+
priceString = priceString.substring(1);
116+
117+
// Remaining should be parseable
118+
return priceString;
119+
}
120+
121+
private static Float tryParsePriceToFloat(String priceString) {
122+
priceString = tryParsePrice(priceString);
123+
if (priceString == null)
124+
return null;
125+
try {
115126
return NumberFormat.getInstance().parse(priceString).floatValue();
116127
} catch (ParseException exception) {
117128
// Silenced
118129
}
119130
return null;
120131
}
132+
133+
private static Float tryParsePriceToBigDecimal(String priceString) {
134+
priceString = tryParsePrice(priceString);
135+
if (priceString == null)
136+
return null;
137+
try {
138+
return new BigDecimal(priceString);
139+
} catch (NumberFormatException exception) {
140+
// Silenced
141+
}
142+
return null;
143+
}
121144
}

gdx-pay-android-googlebilling/src/com/badlogic/gdx/pay/android/googlebilling/PurchaseManagerGoogleBilling.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
import javax.annotation.Nonnull;
1212
import javax.annotation.Nullable;
13+
import java.math.BigDecimal;
14+
import java.math.RoundingMode;
1315
import java.util.*;
1416
import java.util.concurrent.ConcurrentHashMap;
1517

@@ -231,6 +233,7 @@ private void convertSubscriptionProductToInformation(Information.Builder builder
231233
.priceCurrencyCode(paidForPricingPhase.getPriceCurrencyCode())
232234
.priceInCents((int) paidForPricingPhase.getPriceAmountMicros() / 10_000)
233235
.priceAsDouble(paidForPricingPhase.getPriceAmountMicros() / 1_000_000.0)
236+
.priceAsBigDecimal((new BigDecimal(paidForPricingPhase.getPriceAmountMicros())).divide(BigDecimal.valueOf(1_000_000), 6, RoundingMode.FLOOR).stripTrailingZeros())
234237
;
235238

236239
ProductDetails.PricingPhase freeTrialSubscriptionPhase = getFreeTrialSubscriptionPhase(details.getPricingPhases());
@@ -287,7 +290,8 @@ private static void convertOneTimeProductToInformation(Information.Builder build
287290
.localPricing(priceString)
288291
.priceCurrencyCode(oneTimePurchaseDetails.getPriceCurrencyCode())
289292
.priceInCents((int) (oneTimePurchaseDetails.getPriceAmountMicros() / 10_000))
290-
.priceAsDouble(oneTimePurchaseDetails.getPriceAmountMicros() / 1_000_000.0);
293+
.priceAsDouble(oneTimePurchaseDetails.getPriceAmountMicros() / 1_000_000.0)
294+
.priceAsBigDecimal((new BigDecimal(oneTimePurchaseDetails.getPriceAmountMicros())).divide(BigDecimal.valueOf(1_000_000), 6, RoundingMode.FLOOR).stripTrailingZeros());
291295
}
292296

293297
/**

gdx-pay-android-huawei/src/main/java/com/badlogic/gdx/pay/android/huawei/HuaweiPurchaseManagerUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
import org.json.JSONException;
1515

16+
import java.math.BigDecimal;
17+
import java.math.RoundingMode;
1618
import java.util.Date;
1719

1820
class HuaweiPurchaseManagerUtils {
@@ -68,6 +70,7 @@ static Information buildInformation(ProductInfo productInfo) {
6870
.localPricing(priceString)
6971
.priceCurrencyCode(productInfo.getCurrency())
7072
.priceAsDouble(productInfo.getMicrosPrice() / 1_000_000.0)
73+
.priceAsBigDecimal((new BigDecimal(oneTimePurchaseDetails.getPriceAmountMicros())).divide(BigDecimal.valueOf(1_000_000), 6, RoundingMode.FLOOR).stripTrailingZeros())
7174
.build();
7275
}
7376

gdx-pay-iosrobovm-apple/src/main/java/com/badlogic/gdx/pay/ios/apple/PurchaseManageriOSApple.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.robovm.apple.storekit.*;
2424

2525
import javax.annotation.Nullable;
26+
import java.math.BigDecimal;
2627
import java.util.ArrayList;
2728
import java.util.Date;
2829
import java.util.HashSet;
@@ -535,6 +536,7 @@ public Information getInformation(String identifier) {
535536
.priceCurrencyCode(p.getPriceLocale().getCurrencyCode())
536537
.priceInCents(MathUtils.ceilPositive(p.getPrice().floatValue() * 100))
537538
.priceAsDouble(p.getPrice().doubleValue())
539+
.priceAsBigDecimal(new BigDecimal(p.getPrice().stringValue()))
538540
.freeTrialPeriod(convertToFreeTrialPeriod(p))
539541
.build();
540542
}

gdx-pay/src/main/java/com/badlogic/gdx/pay/Information.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.badlogic.gdx.pay;
22

33
import javax.annotation.Nullable;
4+
import java.math.BigDecimal;
45
import java.util.Currency;
56

67
/**
@@ -27,6 +28,7 @@ public final class Information {
2728
@Deprecated
2829
private Integer priceInCents;
2930
private Double priceAsDouble;
31+
private BigDecimal priceAsBigDecimal;
3032

3133
private String priceCurrencyCode;
3234

@@ -45,6 +47,7 @@ private Information(Builder builder) {
4547
localPricing = builder.localPricing;
4648
priceInCents = builder.priceInCents;
4749
priceAsDouble = builder.priceAsDouble;
50+
priceAsBigDecimal = builder.priceAsBigDecimal;
4851
priceCurrencyCode = builder.priceCurrencyCode;
4952
freeTrialPeriod = builder.freeTrialPeriod;
5053
}
@@ -96,6 +99,15 @@ public Double getPriceAsDouble() {
9699
return priceAsDouble;
97100
}
98101

102+
/**
103+
* Price (as a BigDecimal).
104+
* <p>Caution: this field could be null, information is not always available! </p>
105+
*/
106+
@Nullable
107+
public BigDecimal getPriceAsBigDecimal() {
108+
return priceAsBigDecimal;
109+
}
110+
99111
/**
100112
* Price currency code.
101113
* <p>Caution:Note that not all PurchaseManagers set this field!</p>
@@ -169,6 +181,7 @@ public static final class Builder {
169181
@Deprecated
170182
private Integer priceInCents;
171183
private Double priceAsDouble;
184+
private BigDecimal priceAsBigDecimal;
172185
private String priceCurrencyCode;
173186
private FreeTrialPeriod freeTrialPeriod;
174187

@@ -210,6 +223,11 @@ public Builder priceAsDouble(Double val) {
210223
return this;
211224
}
212225

226+
public Builder priceAsBigDecimal(BigDecimal val) {
227+
priceAsBigDecimal = val;
228+
return this;
229+
}
230+
213231
public Builder priceCurrencyCode(String val) {
214232
priceCurrencyCode = val;
215233
return this;

0 commit comments

Comments
 (0)