2012-08-01 35 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));