2012-08-01 9 views
6

हम कुछ float f = 52.92; करते हैं। वास्तव में, यह मान 52.91999816894531 जैसा मान रखेगा। लेकिन मैं उन गैर-महत्वपूर्ण अंकों को छेड़छाड़ करने वाले जेसन-स्ट्रिंग का उपयोग करके इसे अपने वेब-ऐप में भेजना चाहता हूं। यह मैं कैसे करूंगा?जेएसओएन को एन्कोड करते समय फ्लोट को% .2f प्रारूप में कैसे छोटा करें?

{"price": 52.92} 

कोड मैं का उपयोग करें::

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

इस बदसूरत json उत्पादन:

नतीजतन, मैं इस json स्ट्रिंग प्राप्त करने की आवश्यकता

{"price": 52.91999816894531} 

इसके अलावा, मैं "price" को जेसन में एक संख्या प्रारूप होने की आवश्यकता है, स्ट्रिंग नहीं।

+2

पहली जगह कीमतों के लिए 'BigDecimal' के बजाय' float' का उपयोग क्यों कर रहे हैं? जब भी मूल्य स्थानांतरित किया जाता है/छेड़छाड़ की जाती है, तो आप लगातार उन सभी फ़्लोटिंग पॉइंट मुद्दों को ठीक करना जारी रखते हैं और निश्चित संख्या प्रारूप में इसकी अपेक्षा की जाती है। – BalusC

+0

बिगडेसिमल मेरे द्वारा आवश्यक उद्देश्यों के लिए अधिक नेतृत्व में प्रतीत होता है ... – Prizoff

उत्तर

3

ऐसा लगता है, कि मैं constrctor JSONObject(String json), कुछ इस तरह उपयोग कर सकते हैं:

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

और उसके बाद मैं इस वस्तु किसी अन्य json से संबंधित चीजों के साथ कर सकते हैं ...

-2

आप

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

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

और मैं इसे JSON-string में संख्या-प्रारूप में कैसे रखूंगा? – Prizoff

+0

Float.valueOf (मान) .floatValue(); – Gorets

0

AFAIK deserializable मूल्य के बाद इस विधि की कोशिश कर सकते हैं, तो आप ऐसा नहीं कर सकते कि के साथ एक 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

स्ट्रिंग जेसन एक साधारण जेसन ऑब्जेक्ट नहीं है - यह JSONArray और अन्य सामान के साथ जटिल वस्तु है ... मैंने बस न्यूनतम जानकारी के लिए ट्रांस्केट किया है जो समस्या दिखाएगा – Prizoff

+0

@Prizoff हाँ, मुझे लगा कि आपने ऐसा किया होगा ... :( – Alnitak

+0

@Prizoff संपादन देखें ... – Alnitak

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

स्ट्रिंग.फॉर्मैट

का उपयोग करने का प्रयास करें

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-string में संख्या-प्रारूप में कैसे रखूंगा? – Prizoff

+0

मुझे आपके प्रश्न को अधिक सावधानी से पढ़ना चाहिए था। मैं मुद्रा के लिए फ्लोट के बजाय BigDecimal का उपयोग करने का सुझाव दूंगा। – gsjava

+0

हाँ, यह (String.format (...)) काम नहीं करेगा क्योंकि js_price एक फ्लोट नहीं है ... – Prizoff

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

} 

n बस js_price.put("price", BigDecimalUtils.format(f));

संबंधित मुद्दे