2012-08-01 42 views
6

讓我們有一些float f = 52.92;。事實上,它將保持類似52.91999816894531的價值。但我想使用json-string截斷這些非重要數字將其傳輸到我的web應用程序。我將如何做到這一點?如何將float編碼爲%.2f格式並將其編碼爲JSON?

其結果是,我需要獲得此JSON字符串:

{"price": 52.92} 

我使用的代碼:

float f = 52.92; 
JSONObject js_price = new JSONObject(); 
js_price.put("price", f); 
Log.d("json", js_price.toString()); 

可生產這種醜陋的JSON:

{"price": 52.91999816894531} 

另外,我需要"price"是json中的數字格式,而不是字符串。

+2

爲什麼你使用'float'而不是'BigDecimal'的價格在第一位?每當值被傳送/操作/等等,並且預期都是固定數字格式時,你總是保持解決所有這些浮點問題。 – BalusC 2012-08-01 17:21:20

+0

BigDecimal似乎是爲了我所需要的目的... – Prizoff 2012-08-01 17:38:25

回答

3

看來,我可以使用constrctor JSONObject(String json),這樣的事情:

JSONObject js_price = JSONObject(String.format("{\"price\": %.2f}", f); 

之後,我可以用這個對象的任何其他JSON相關的事情要做......

-2

您可以後deserializable值試試這個方法

DecimalFormat dec = new DecimalFormat("###.##"); 

System.out.println(dec.format(value)); 
+0

而我將如何把它放在數字格式的JSON字符串? – Prizoff 2012-08-01 17:22:09

+0

Float.valueOf(value).floatValue(); – Gorets 2012-08-01 17:23:39

0

AFAIK,你不能這樣做與JSONObject

由於沒有像52.92這樣精確的浮點值,所以您實際上必須使用字符串格式設置規則,但是您不能讓JSON編碼器將該值視爲數字而不是引用字符串。

你不得不做的事:

String json = String.format("{\"price\", %.2f }", f); 

在任何情況下,當JSON讀回在客戶端,它仍然不會52.92,它會再次成爲52.91999816894531。所以你所取得的只是JSON規模的小幅節省。

另一種方法是將數字乘以100,然後將其作爲整數發送。當你在客戶端分割它時,你仍然會得到52.91999...

您還可能能夠JSONObject子類,並重寫此方法:

static public java.lang.String numberToString(java.lang.Number number) 
+0

字符串json不是一個簡單的json對象 - 它是帶有JSONArray和其他東西的複雜對象......我只是將所有信息都轉換爲最小信息,這將顯示問題 – Prizoff 2012-08-01 17:23:38

+0

@Prizoff是的,我想你可能已經這麼做了...... :( – Alnitak 2012-08-01 17:24:00

+0

@Prizoff見編輯... – Alnitak 2012-08-01 17:29:48

0

給GSON一試...

class Serializer { 

// You can register custom serilaizers to it to suite your needs  
private static Gson gson = new GsonBuilder().create(); 

    public static final <T> String toJSON(T clazz) { 
     return gson.toJson(clazz); 
    } 
} 

然後使用下面的代碼來獲得JSON字符串

float f = 52.92; 
Map<String,Object> js_price = new HashMap<String,Object>() 
js_price.put("price", f); 
String json = Serializer.toJSON(js_price) 
1

嘗試使用String.format

Log.d("json", String.format("%.2f", f));

編輯:

是使用需要浮動,或者你可以嘗試雙?

double d = 52.92; 
    JSONObject js_price = new JSONObject(); 
    js_price.put("price", d); 
    Log.d("json", js_price.toString()); 
+0

而我將如何把它放在數字格式的JSON字符串? – Prizoff 2012-08-01 17:21:57

+0

我應該更仔細地閱讀你的問題。我會建議使用BigDecimal而不是浮動貨幣。 – gsjava 2012-08-01 17:27:15

+0

是的,這(String.format(...))將不會工作,因爲js_price不是一個浮點數... – Prizoff 2012-08-01 17:29:15

0

我會用你自己的參數使用這個工具類:

public class BigDecimalUtils { 

    /** 
    * <code>MathContext</code> with precision 10 for coordinates. 
    */ 
    private final static MathContext MC = new MathContext(10); 

    /** Scale for coordinates. */ 
    private final static int SCALE = 6; 

    public static float format(double aDouble) { 
     BigDecimal bdLatitude = new BigDecimal(aDouble, MC).setScale(SCALE, RoundingMode.HALF_UP); 
     return bdLatitude.floatValue(); 
    } 

    public static float format(float aFloat) { 
     BigDecimal bdLatitude = new BigDecimal(aFloat, MC).setScale(SCALE, RoundingMode.HALF_UP); 
     return bdLatitude.floatValue(); 
    } 

} 

ñ只是打電話js_price.put("price", BigDecimalUtils.format(f));