2012-08-01 16 views
6

float f = 52.92;があります。実際には、それは52.91999816894531のような値を保持します。しかし、私はjson-stringを使ってそれを私のweb-appに送信したいと思います。どうすればいい?浮動小数点数を%.2f形式に切り捨ててJSONにエンコードする方法は?

{"price": 52.92} 

私が使用するコード:結果として、私はこのJSON文字列を取得する必要があり

私は、また

{"price": 52.91999816894531} 

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

はこの醜いJSONを生成します"price"は、文字列ではなくjsonの数値形式にする必要があります。

+2

なぜ、最初に価格のために 'BigDecimal'ではなく' float'を使用していますか?値が転送/操作されるときはいつでも浮動小数点の問題をすべて修正し続け、固定数値形式で期待されています。 – BalusC

+0

BigDecimalは私に必要な目的のために頭を悩ましているようです... – Prizoff

答えて

-2

あなたはdeserializable値の後

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

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

そしてこれをJSON文字列で数値フォーマットでどのように記述しますか? – Prizoff

+0

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

0

私の知る限りこの方法を試すことができ、あなたが行うことができないとJSONObjectいます。

52.92のような正確な浮動小数点値はないので、実際には文字列書式設定ルールを使用する必要がありますが、JSONエンコーダではその値を引用符付きの文字列ではなく数値として扱うことはできません。あなたがしなければならないと思います

:いずれにしても

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

JSONはクライアントで読み戻されたとき、それまだは、それが再び52.91999816894531だろう、52.92ではありません。つまり、JSONのサイズを小さくするだけです。

もう1つの方法として、数値に100を掛けて整数として送信する方法があります。あなたはまだを得ますあなたがクライアント側でそれを分割するとき!

また、サブクラスJSONObjectのことができるように、このメソッドをオーバーライドすることがあります。

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

文字列jsonは単純なjsonオブジェクトではありません - JSONArrayなどの複雑なオブジェクトです...問題を表示する最小限の情報にすべてを変換しました – Prizoff

+0

@Prizoffええ、私はあなたがそれをしたかもしれないと考えました... : – Alnitak

+0

@Prizoff編集を参照してください... – Alnitak

0

は、JSON文字列を取得するには、次のコードを使用し、その後... 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); 
    } 
} 

を試してみて

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

+0

私はあなたの質問をより慎重に読むべきだった。私はfloatの代わりにBigDecimalを使って通貨を提案します。 – gsjava

+0

これは、js_priceが浮動小数点型ではないので、この(String.format(...))はまったく動作しません。 – Prizoff

0
...

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

その後、私はこのオブジェクトに他のJSON関連のことを行うことができます

私はこのユーティリティクラスを独自のパラメータで使用します:

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

} 

nだけを呼び出すjs_price.put("price", BigDecimalUtils.format(f));

関連する問題