Как усечь float в формат% .2f при кодировании JSON?

Пусть мы имеем некоторый float f = 52.92; , Фактически, он будет хранить значение примерно как 52.91999816894531 . Но я хочу передать его в свое веб-приложение, используя json-string, усекающую эти незначительные цифры. Как мне это сделать?

В результате мне нужно получить эту строку 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, а не строкой.

Кажется, я могу использовать constrctor JSONObject (String json) , что-то вроде этого:

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

И после этого я могу сделать с этим объектом любые другие связанные с json вещи …

Попробуйте использовать 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()); 

Дайте 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) 

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) 

Я бы использовал этот класс утилиты с вашими собственными параметрами:

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

Вы можете попробовать этот метод после десериализуемого значения

 DecimalFormat dec = new DecimalFormat("###.##"); System.out.println(dec.format(value)); 
Intereting Posts
Динамическая сортировка CursorAdapter JQuery – разрешить клавиатуру Autoshow на мобильных устройствах Соблюданные идентификаторы пакета «build-tools», 20.0.0 »в несовместимом месте Как записывать и сохранять в качестве mp3-потокового аудио mp3 Как использовать OpenStreetMap в разработке собственных приложений для Android Андроид – просто выцветать и исчезать в анимации для просмотра Как перемещать макет, когда отображается мягкая клавиатура Android Ошибка запуска менеджера SDK: «find_java.exe несовместим с версией Windows, в которой вы работаете» Android одновременно работает с Wifi Lan и Wifi Direct Unsatisfiedlinkerror OpenALPR тестовый проект для Android Ответная реакция загрузки на мобильный Как добавить горизонтальный RecyclerView в элемент списка Обработчик элемента элемента действия в фрагменте Android: onCreate () вызывается несколько раз (а не мной) Есть ли способ запустить стеклянную посуду в эмуляторе?