2012-08-01 9 views
6

Vamos a tener algunos float f = 52.92;. De hecho, mantendrá el valor algo así como 52.91999816894531. Pero quiero transmitirlo a mi aplicación web usando json-string truncando esos dígitos no significativos. ¿Cómo haría esto?Cómo truncar float al formato% .2f mientras lo codifica en JSON?

Como resultado, tengo que obtener esta cadena JSON:

{"price": 52.92} 

El código que utilizo:

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

Produce esta fea JSON:

{"price": 52.91999816894531} 

También, necesita "price" para ser un formato de número en json, no una cadena.

+2

¿Por qué está usando 'float' en lugar de' BigDecimal' para los precios en primer lugar? Usted mantiene constantemente la fijación de todos los problemas de punto flotante cada vez que el valor se va a transferir/manipular/etc. y se espera en un formato de número fijo. – BalusC

+0

BigDecimal parece estar descuidado para los fines que yo necesito ... – Prizoff

Respuesta

3

Parece, que puedo utilizar el constrctor JSONObject(String json), algo como esto:

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

y después de eso se puede hacer con este objeto cualesquiera otros elementos relacionados con JSON-...

-2

Puede probar este método después de valor deserializable

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

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

¿Y cómo voy a poner esto en cadena JSON en formato de número? – Prizoff

+0

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

0

yo sepa, no se puede hacer eso con un JSONObject.

Dado que no existe un valor de coma flotante tan exacto como 52.92, realmente tiene que usar reglas de formato de cadena, pero no puede hacer que el codificador JSON trate ese valor como un número en lugar de una cadena entrecomillada.

Habría que hacer:

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

En cualquier caso, cuando el JSON se vuelve a leer en el cliente, que todavía no será 52.92, será 52.91999816894531 nuevo. Entonces, todo lo que habrá logrado es un pequeño ahorro en el tamaño de su JSON.

La otra alternativa sería multiplicar el número por 100 y luego enviarlo como un número entero. Sin embargo, todavía obtenga 52.91999... cuando lo divide en el lado del cliente.

También puede ser capaz de subclase JSONObject y reemplazar este método:

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

String json no es un simple objeto json, es un objeto complejo con JSONArray y otras cosas ... Acabo de traspasar todo a una información mínima que mostrará el problema – Prizoff

+0

@Prizoff, sí, pensé que podrías haber hecho eso ... :( – Alnitak

+0

@Prizoff ver ediciones ... – Alnitak

0

Dale GSON una oportunidad ...

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

a continuación, utilizar el siguiente código para conseguir cadena 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

Pruebe usar String.format

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

Editar:

está utilizando un flotador requiere, o podría tratar doble?

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

¿Y cómo voy a poner esto en cadena JSON en formato de número? – Prizoff

+0

Debería haber leído su pregunta con más cuidado. Sugeriría usar BigDecimal en lugar de float para moneda. – gsjava

+0

sí, esto (String.format (...)) no funcionará en absoluto, ya que js_price no es un flotante ... – Prizoff

0

me gustaría utilizar esta clase de servicio con sus propios parámetros:

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

} 

El n solo llame al js_price.put("price", BigDecimalUtils.format(f));

Cuestiones relacionadas