Преобразовать строку в BigDecimal в Android - PullRequest
0 голосов
/ 14 февраля 2020

Данные, возвращаемые из API моего приложения, содержат цену продукта, сохраненную в виде строки, например:

{
   price:"1500"
}

Это вызывает исключение NumberFormatException, поскольку тип данных, используемый в модели Product, является BigDecimal. Как мне разобрать эту строку из базы данных в BigDecimal перед ее использованием в приложении?

Я использую Retrofit и GSON, и попробовал решения здесь:

NumberFormatException в GSON при преобразовании String в удвоение

Решение 1:

GsonBuilder gb = new GsonBuilder();
    gb.registerTypeAdapter(Float.class, new TypeAdapter<Float>() {

        @Override
        public Float read(JsonReader reader) throws IOException {
            if (reader.peek() == JsonToken.NULL) {
                reader.nextNull();
                return null;
            }
            String stringValue = reader.nextString();
            try {
                Float value = Float.valueOf(stringValue);
                return value;
            } catch (NumberFormatException e) {
                return null;
            }
        }

        @Override
        public void write(JsonWriter writer, Float value) throws IOException {
            if (value == null) {
                writer.nullValue();
                return;
            }
            writer.value(value);
        }

    });

Это решение кажется правильным, но мне не удалось вернуть проанализированное значение при возникновении исключения, вместо возврата null.

Решение 2:

.registerTypeAdapter(Double.class, new JsonSerializer<Double>() {
            public JsonElement serialize(Double number, Type type, JsonSerializationContext context) {
                return new JsonPrimitive(Double.valueOf(number));
            }
        })

Для этого решения BigDecimal не поддерживается типом данных JsonPrimitive.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Попробуйте это

GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(String.class, new TypeAdapter<String>() {

    @Override
    public String read(JsonReader reader) throws IOException {
        if (reader.peek() == JsonToken.NULL) {
            reader.nextNull();
            return null;
        }
        String stringValue = reader.nextString();
        try {
            BigDecimal value = new BigDecimal(stringValue);
            globalVariable = value;  //globalVariable must be of type BigDecimal OR provide some callback mechanism here
            return stringValue;
        } catch (NumberFormatException e) {
            return null;
        }
    }

    @Override
    public void write(JsonWriter writer, Float value) throws IOException {
        if (value == null) {
            writer.nullValue();
            return;
        }
        writer.value(value);
    }

});
0 голосов
/ 14 февраля 2020

у меня нормально работает

String total=“1500.00”;

BigDecimal sPrice = new BigDecimal(total);
...