Since Google Play can return prices in a currency format that is not supported by java.text.NumberFormat, I wrote my own implementation
public class Price { private double value; private String currency; private String pattern; private DecimalFormat decimalFormat; private Price() {} private static String currencyToDecimalFormat(String value, Price price) { char decimalSeparator = '.'; char groupingSeparator = 0; if (value.length() >= 3) { char[] chars = value.toCharArray(); if (chars[chars.length - 2] == ',') { decimalSeparator = ','; chars[chars.length - 2] = '.'; } else if (chars[chars.length - 3] == ',') { decimalSeparator = ','; chars[chars.length - 3] = '.'; } value = new String(chars); } if (value.contains(",")) { groupingSeparator = ','; value = value.replaceAll(",", ""); } else if (value.contains(" ")) { groupingSeparator = ' '; value = value.replaceAll(" ", ""); } else if (value.contains("\u00A0")) { groupingSeparator = '\u00A0'; value = value.replaceAll("\u00A0", ""); } DecimalFormatSymbols symbols = new DecimalFormatSymbols(); if (groupingSeparator != 0) { price.decimalFormat = new DecimalFormat("###,###.00"); symbols.setGroupingSeparator(groupingSeparator); } else { price.decimalFormat = new DecimalFormat("######.00"); } symbols.setDecimalSeparator(decimalSeparator); price.decimalFormat.setDecimalFormatSymbols(symbols); return value.replaceAll(",", ""); } public static Price parsePrice(String priceFromGoogle) { Price price = new Price(); StringBuilder patternBuilder = new StringBuilder(); Pattern pattern = Pattern.compile("(?:[0-9]{1,3})(?:[0-9,.\\s\u00A0]+)"); Matcher matcher = pattern.matcher(priceFromGoogle); matcher.find(); String priceString = matcher.group(); if (priceFromGoogle.indexOf(priceString) == 0) { if (priceFromGoogle.length() != priceString.length()) { price.currency = priceFromGoogle.substring(priceString.length()); } else { price.currency = ""; } } else { price.currency = priceFromGoogle.substring(0, priceFromGoogle.indexOf(priceString)); } price.currency = price.currency.trim(); if (priceFromGoogle.startsWith(price.currency)) { patternBuilder.append("%1s"); char nextChar = priceFromGoogle.charAt(price.currency.length()); if (nextChar == ' ' || nextChar == 0xA0) { patternBuilder.append(' '); } patternBuilder.append("%2$s"); } else { patternBuilder.append("%2$s"); char prevChar = priceFromGoogle.charAt(priceFromGoogle.indexOf(price.currency) - 1); if (prevChar == ' ' || prevChar == 0xA0) { patternBuilder.append(' '); } patternBuilder.append("%1s"); } price.pattern = patternBuilder.toString(); priceString = trim(priceString); priceString = currencyToDecimalFormat(priceString, price); price.value = Double.parseDouble(priceString); return price; } @Override public String toString() { if (pattern != null) { return String.format(pattern, currency, decimalFormat.format(value)); } else { return ""; } }
}
EDIT1:
Because Google uses unused space instead of regular space, you need to check this and use the custom trim function:
public static String trim(String text) { int start = 0, last = text.length() - 1; int end = last; while ((start <= end) && (text.charAt(start) <= ' ' || text.charAt(start) == 0xA0)) { start++; } while ((end >= start) && (text.charAt(end) <= ' ' || text.charAt(end) == 0xA0)) { end--; } if (start == 0 && end == last) { return text; } return text.substring(start, end); }
source share