Сравнение Строки к Целому числу дает странные результаты

Я предлагаю изменить ваш запрос, следуя этому формату. Особенно обратите внимание на request.Method и request.ContentType, которые меня поймали несколько раз. Кроме того, обработка ответа легче этим способом.

try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(YOURURL);
                request.ContentType = "application/json; charset=utf8";
                request.Headers.Add(ADD HEADER HERE IF YOU NEED ONE);
                request.Method = WebRequestMethods.Http.Post; // IMPORTANT

                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                     streamWriter.Write(JsonConvert.SerializeObject(JSONBODYSTRING)); 
// I USUALLY YOU JSONCONVERT HERE TO SIMPLY SERIALIZE A STRING CONTAINING THE JSON INFO. 
//BUT I GUESS YOUR METHOD WOULD ALSO WORK
                    streamWriter.Flush();
                    streamWriter.Close();
                }

                WebResponse response = request.GetResponse();
                using (var streamReader = new StreamReader(response.GetResponseStream()))
                {
                    string result = streamReader.ReadToEnd();
                    // DO WHATEVER YOU'D LIKE HERE
                }
            } catch (Exception ex)
            {
               // HANDLE YOUR EXCEPTIONS
            }
31
задан user2864740 14 March 2014 в 06:21
поделиться

4 ответа

Из руководства PHP:

Преобразование строк к числам

, Когда строка оценена в числовом контексте, получающееся значение и тип определяются следующим образом.

строка будет оценена как плавание, если она будет содержать какой-либо из символов '.', 'e', или 'E'. Иначе это будет оценено как целое число.

значение дано начальной частью строки. Если строка запустится с допустимых числовых данных, то это будет используемым значением. Иначе значение будет 0 (нуль). Допустимые числовые данные являются дополнительным знаком, сопровождаемым одной или несколькими цифрами (дополнительно содержащий десятичную точку), сопровождаемый дополнительной экспонентой. Экспонента является 'e' или 'E', сопровождаемым одной или несколькими цифрами.

38
ответ дан Assaf Lavie 27 November 2019 в 22:13
поделиться

Преобразование типов с помощью == оператор

== оператор является свободно введенным сравнением. Это преобразует и в общий тип и сравнит их. Путем строки преобразовываются в целые числа, объяснены здесь .

Примечание, что страница Вы связались с [1 112], не противоречит этому. Проверьте вторую таблицу, где она говорит, что, сравнивая целое число 0 к строке "php" использование == должно быть верным.

то, Что происходит, - то, что строка преобразовывается в целое число и нечисловые строки (строки, которые не содержат или начинаются с числа), преобразовывают в 0.

Числовой по сравнению с нечисловыми строками

строку А, которая состоит из числа или начинается с числа, рассматривают числовая строка . Если строка имеет другие символы после того числа, они проигнорированы.

, Если строка запускается с символа, который не может быть интерпретирован как часть числа, тогда это нечисловая строка и преобразует в 0. Это не означает, что числовая строка должна запуститься с цифры (0-9) - например "-1", числовая строка, потому что знак "минус" является частью числа в этом случае.

Так, например, Ваша строка "d85d1d81b25614a3504a3d5601a9cb2e" не запускается с числа, таким образом, она преобразовала бы в 0. Но Ваша вторая строка "3581169b064f71be1630b321d3ca318f" была бы преобразована в целое число 3581169. Таким образом, вот почему Ваш второй тест не работает тот же путь.

, Что необходимо сделать

, Вы, вероятно, хотите:

if ($test1 === "0")

Уведомление, которому использование тройных равняется вместо двойного, равняется. Это гарантирует, что то, что Вы сравниваете, является строкой, которая содержит нуль цифры только и предотвращает любое преобразование типов.

10
ответ дан thomasrutter 27 November 2019 в 22:13
поделиться

После некоторого расследования оказывается, что aidan из руководства PHP упомянул, что любые строки, которые не запускаются с номера , будут преобразованы в 0, когда литой как целое число.

Это означает что:

("php" == 0) === true
("1php" == 0) === false

Очень раздражающий и не хорошо зарегистрированный. Это было в нижней части комментариев к странице сравнения типов.

7
ответ дан St. John Johnson 27 November 2019 в 22:13
поделиться
$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";

эта строка начинается с «d», что является недопустимым числом, переменная будет преобразована в 0, и ваш тест # 1 пройдет.

$test2 = "3581169b064f71be1630b321d3ca318f";

эта строка начинается с 3581169, который является допустимым числом, поэтому переменная будет преобразована в значение, которое не равно 0. Таким образом, ваш тест № 2 не пройдет.

2
ответ дан HBR 27 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: