2015-02-06 53 views
1

新的网站和Android编程,所以我希望有人可以帮助我。我正在努力自我教导,并认为自己有点小菜。现在我更喜欢这个网站的消费者,但希望能成为一个贡献者。保存一个BigDecimal值为json

我在片段中创建了一个EditText,我想捕获一个美元金额/货币值。我正在尝试使用BigDecimal,但我很难实现。我有一个名为Transaction的类,我定义了getters和setter以及我的JSON对象。例如我的getter和setter方法实现:

public BigDecimal getAmount() { 
    return mAmount; 
} 

public void setAmount(BigDecimal amount) { 
    mAmount = amount; 
} 

和我的JSON保存和检索的模样:

json.put(JSON_AMOUNT, mAmount); 



if (json.has(JSON_AMOUNT)) { 
     mAmount = BigDecimal.valueOf(json.getDouble(JSON_AMOUNT)); 
} 

在我的我的片段OnCreateView,我的EditText样子:

mAmountField = (EditText)v.findViewById(R.id.transaction_amount); 
    mAmountField.setText((CharSequence) mTransaction.getAmount()); 
    mAmountField.addTextChangedListener(new TextWatcher() { 

     DecimalFormat dec = new DecimalFormat("0.00"); 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (!s.toString().matches("\\$(d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$")) { 
       String userInput = "" + s.toString().replaceAll("[^\\d]", ""); 
       if (userInput.length() > 0) { 
        Float in = Float.parseFloat(userInput); 
        float percent = in/100; 
        mAmountField.setText("$" + dec.format(percent)); 
        mAmountField.setSelection(mAmountField.getText().length()); 
       } 

       mTransaction.setAmount(BigDecimal.valueOf()); 

       } 

      } 

      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      public void afterTextChanged(Editable s) { 

      } 

     }); 

我无法弄清楚的是如何将为mAmountField输入的值保存到我的JSON对象中。与我刚刚使用的字符串(例如):

public void onTextChanged(CharSequence s, int start, int before, int count) { 
     mTransaction.setDetails(s.toString()); 
    } 

但我找不出一个BigDecimal正确的语法。任何帮助或见解将不胜感激。提前致谢!

+0

如果您使用Android的标准org.json库,唯一的数字类型是长或双。如果Double会给你合适的精度,那么就使用它。或者,您可能需要使用'toString()'方法来简单地将该值写为String。 – Squonk 2015-02-06 03:32:57

+0

仅供参考,json.org库的master分支提交了一个提交[BigInteger和BigDecimal支持](https://github.com/douglascrockford/JSON-java/pull/135),所以期待它在未来的版本中。 – Will 2015-09-24 16:04:44

回答

0

如果你想为BigDecimal保存为字符串的JSONObject你需要使用toString()

json.put(JSON_AMOUNT, mAmount.toString()); 

,然后当你想要得到值回

BigDecimal mAmount= new BigDecimal(json.optString(JSON_AMOUNT,"0")); 

PS。你可以使用getString()而不是optString(),但我推荐optString(),因为你可以设置默认值是不存在的关键。

另一个建议是使用Gson库在json和value之间进行转换,您可以序列化整个对象并将其反序列化。