2012-08-01 4 views
6

Lassen Sie uns einige float f = 52.92; haben. In der Tat wird es den Wert etwas wie 52.91999816894531 halten. Aber ich möchte es an meine Web-App übertragen, indem ich json-string benutze, um diese nicht signifikanten Ziffern abzuschneiden. Wie würde ich das tun?Wie trenne ich Float im% .2f-Format, während ich es in JSON umwandle?

Als Ergebnis muß ich dieses JSON-String erhalten:

{"price": 52.92} 

Der Code ich benutze:

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

Erzeugt diesen hässlichen json:

{"price": 52.91999816894531} 

Auch ich brauche "price" um ein Zahlenformat in JSON zu sein, keine Zeichenfolge.

+2

Warum verwenden Sie 'float' anstelle von' BigDecimal' für Preise an erster Stelle? Sie werden ständig mit der Behebung all dieser Gleitkomma-Probleme fortfahren, wann immer der Wert übertragen/manipuliert/usw. wird und in einem festen Zahlenformat erwartet wird. – BalusC

+0

BigDecimal scheint für die Zwecke, die von mir benötigt werden, übertrieben zu sein ... – Prizoff

Antwort

3

Es scheint, dass ich die constrctor verwenden können JSONObject(String json), etwa wie folgt:

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

und danach kann ich andere json-bezogene Dinge mit diesem Objekt zu tun ...

-2

Sie können versuchen, diese Methode nach deserializable Wert

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

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

Und wie werde ich das in JSON-String im Zahlenformat einfügen? – Prizoff

+0

Float.valueOf (Wert) .floatValue(); – Gorets

0

AFAIK, können Sie nicht mit einem JSONObject.

Da es keinen solchen exakten Fließkommawert wie 52.92 gibt, müssen Sie wirklich die Formatierungsregeln verwenden, aber dann können Sie den JSON-Encoder nicht als Zahl behandeln, anstatt als String in Anführungszeichen.

Sie würden zu tun haben:

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

In jedem Fall, wenn die JSON zurück an den Client gelesen wird, es noch wird nicht 52.92, es 52.91999816894531 wieder sein werden. Alles, was Sie erreicht haben, ist eine kleine Einsparung in der Größe Ihres JSON.

Die andere Alternative wäre, die Zahl mit 100 zu multiplizieren und dann als Ganzzahl zu senden. Sie werden noch bekommen 52.91999..., wenn Sie es auf der Clientseite teilen, obwohl!

Sie können auch in der Lage sein, Unterklasse JSONObject und überschreiben diese Methode:

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

String JSON ist kein einfaches JSON-Objekt - es ist ein komplexes Objekt mit JSONArray und anderen Sachen ... Ich habe einfach alle auf ein Minimum an Informationen umgestellt, die das Problem zeigen werden – Prizoff

+0

@Prizoff yeah, ich dachte du hättest das vielleicht gemacht ... :( – Alnitak

+0

@ Prizoff siehe Bearbeitungen ... – Alnitak

0

Gson Probieren Sie ...

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

dann den folgenden Code verwenden JSON-String zu erhalten

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

Verwenden Sie String.format

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

Edit:

wird mit einem Schwimmer erforderlich ist, oder könnten Sie versuchen, doppelt?

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

Und wie werde ich das in JSON-String im Zahlenformat einfügen? – Prizoff

+0

Ich hätte Ihre Frage besser lesen sollen. Ich würde vorschlagen, BigDecimal anstelle von Float für Währung zu verwenden. – gsjava

+0

yep, dies (String.format (...)) wird überhaupt nicht funktionieren, da js_price kein float ist ... – Prizoff

0

würde ich diese Utility-Klasse mit Ihrem eigenen Parameter verwenden:

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

} 

Die n rufen Sie einfach js_price.put("price", BigDecimalUtils.format(f));

Verwandte Themen