【问题标题】:Convert String into a BigDecimal in Android在 Android 中将 String 转换为 BigDecimal
【发布时间】:2020-05-29 21:28:39
【问题描述】:

从我的应用程序 API 返回的数据包含存储为字符串的产品价格,例如:

{
   price:"1500"
}

这会导致 NumberFormatException,因为 Product 模型中使用的数据类型是 BigDecimal。在应用程序中使用它之前,如何将数据库中的这个字符串解析为 BigDecimal?

我正在使用 Retrofit 和 GSON,并尝试过这里的解决方案:

NumberFormatException in GSON when converting String to double

解决方案 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 数据类型。

【问题讨论】:

  • 在应用程序中使用它之前,如何将数据库中的这个字符串解析为 BigDecimal? 您只需将其存储在字符串中并将其解析为 BigDecimal
  • 我知道该怎么做。我的问题是如何使用它来将 json 字符串解析为大十进制。
  • 您确定您不是在尝试解析 json 字符串吗?在解析之前记录字符串,以便您可以了解正在解析的内容
  • 价格是一个字符串。我的问题是如何使用类型适配器或 json 序列化器将其解析为大十进制

标签: android json gson retrofit


【解决方案1】:

对我来说很好用

String total=“1500.00”;

BigDecimal sPrice = new BigDecimal(total);

【讨论】:

  • 如何使用它来解析 JSON 数据?数据库中的字符串导致 NumberFormatEXception。
  • 哪个数据库mysql或sqlite?
  • 数据库是sql,数据是从api返回的
【解决方案2】:

试试这个

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);
    }

});

【讨论】:

  • 您不能在为字符串声明类型适配器的地方返回大小数
猜你喜欢
  • 2013-08-26
  • 2016-07-23
  • 1970-01-01
  • 2018-06-11
  • 2017-07-27
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多