Ответ JSON {"d": "128.00"}, но отображается "128" - PullRequest
1 голос
/ 15 апреля 2010

Я работал над корзиной покупок, чтобы пользователь мог добавлять / удалять элементы заказа по своему усмотрению, и я возвращаю обновленную промежуточную сумму через веб-сервис, используя jQuery $ .ajax

Вот как я звоню веб-службе и устанавливаю промежуточный итог с ответом.

//perform the ajax call
$.ajax({
    url: p,
    data: '{' + s + '}',
    success: function(sTotal) {
        //order was updated: set span to new sub-total
        $("#cartRow" + orderID).find(".subTotal").text(sTotal);
    },
    failure: function() {
        //if the orer was not saved

        //console.log('Error: Order not deleted');
    }
});

Ответ, который я получаю, кажется совершенно нормальным:

{"d":"128.00"} 

Когда я отображаю сумму на странице, она отображается как 128, а не 128.00

Я полностью уверен, что это что-то очень простое и глупое, но я так глубоко в этом разбираюсь, теперь мне нужен кто-то со свежим умом, чтобы выручить меня !!

Приветствия:)

EDIT

Я также использую $ .ajaxSetup, чтобы установить правильный тип содержимого:

$.ajaxSetup({
type: "POST",
contentType: "application/json; charset=utf-8",
data: "{}",
dataFilter: function(data) {
    var msg;

    if (typeof (JSON) !== 'undefined' &&
    typeof (JSON.parse) === 'function')
        msg = JSON.parse(data);
    else
        msg = eval('(' + data + ')');

    if (msg.hasOwnProperty('d'))
        return msg.d;
    else
        return msg;
}

});

Ответы [ 3 ]

2 голосов
/ 15 апреля 2010

Это потому, что значение обрабатывается как число, а вы хотите, чтобы оно рассматривалось как строка. Когда вы используете '.. .text (sTotal)', вы фактически вызываете метод .toString () для объекта Number, оборачивающего примитив sTotal. А поскольку это целое число, оно отображается без десятичных знаков. Вам нужно использовать формат числа в виде строки перед вызовом .text (foo) для числа, которое будет отформатировано таким образом.

Это даст вам два десятичных знака

var a=1/3; 
a = a.toString(); 
switch(a.lastIndexOf(".")){ 
    case -1: 
        a+=".00";
        break; 
    case a.length-2: 
        a+="0"; 
        break; 
    default: 
        a=a.substring(0, a.indexOf(".") + 3); 
} 
alert(a); 
1 голос
/ 15 апреля 2010

Пожалуйста, попробуйте это:

 $("#cartRow" + orderID).find(".subTotal").text(sTotal.toFixed(2));

НТН

1 голос
/ 15 апреля 2010

Я не вижу нигде в этом коде, где вы получаете доступ к свойству d ответа.

Возможно, вы хотите это сделать?

$("#cartRow" + orderID).find(".subTotal").text(sTotal.d);
// --------------------------------------------------^^

EDIT

Хорошо, я вижу проблему. Вы возвращаете JSON, но не определяете dataType в вызове $.ajax(). Это означает, что jQuery видит ваш application/json mimetype и интерпретирует ответ как JSON. 128.00 в JSON - это число , а не строка . Однако "128.00" будет строкой.

Чтобы это работало, вам нужно отформатировать ответ перед его печатью (как предлагали другие) или настроить конечную точку так, чтобы она возвращала действительную строку JSON .

Вот мой тест, чтобы доказать решение

<div id="test">
  Subtotal <span class="subTotal"></span>
</div>

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript" charset="utf-8">
  google.load("jquery", "1.4.2");
</script>
<script type="text/javascript" charset="utf-8">

$.ajax({
  url: 'test.php',
  data: {},
  success: function(sTotal) {
    //order was updated: set span to new sub-total
    $("#test").find(".subTotal").text(sTotal);
  }
});

</script>

и test.php

<?php

header( 'Content-type: application/json' );
echo '128.00';

выход

Итого 128

Но когда я изменяю test.php на это

<?php

header( 'Content-type: application/json' );
echo '"128.00"';

Ожидаемый результат генерируется

Итого 128,00

Или вы можете указать jQuery обрабатывать ответ как текст, указав параметр dataType , например

$.ajax({
  url: 'test.php',
  data: {},
  dataType: 'text',  // <---- here
  success: function(sTotal) {
    //order was updated: set span to new sub-total
    $("#test").find(".subTotal").text(sTotal);
  }
});

РЕДАКТИРОВАТЬ 2

Хорошо, после того, как я еще немного поиграюсь с этим, я увижу, что происходит. Определенный вами обработчик dataFilter преобразует ответ в сам JSON и в этом случае возвращает строку 128.00. Тем не менее, , jQuery по-прежнему применяет к значению, предполагаемому целым числом (который является JSON), перед отправкой его обработчику успеха.

Существует множество способов исправить это, каждый из которых зависит от того, для чего другие приложения AJAX называют ваше приложение, полагаясь на эту настройку. Быстрое исправление, которое я применил в своем тесте, состояло в том, чтобы сделать это

$.ajaxSetup({
  type: "POST",
  contentType: "application/json; charset=utf-8",
  data: "{}",
  // define the text data type so that we return data.d, jQuery doesn't parse it as JSON again
  dataType: 'text',
  dataFilter: function(data) {
      data = $.parseJSON( data ); // Use jQuery's parsing
      if (data.hasOwnProperty('d'))
      {
          return data.d;
      }else{
          return data;
      }
  }
});

Но это может не сработать для вас по всем направлениям

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...