php将字符串转换为整数意外行为

时间:2017-11-09 10:03:28

标签: php

var_dump((int) 010);  //Output 8

var_dump((int) "010"); //output 10

无法理解PHP数据类型转换方法从字符串到整数。

第一个是八进制表示法,因此输出正确。但是什么时候将“010”转换为整数。它也应该输出8。

以下所有答案都是 var_dump((int)010); ,但我想回答 var_dump((int)“010”);

5 个答案:

答案 0 :(得分:5)

使用(int)投射到整数将始终强制转换为默认基数,即10。

以这种方式将字符串转换为数字不会考虑在PHP中格式化整数值的多种方式(对于基数8,前导零和#34; 0x和#34;基数16,领先" 0b"基数2)。它将简单地查看字符串中的第一个字符并将它们转换为基数为10的整数。前导零将被剥离,因为它们在数值中没有意义,因此您最终会得到10的小数值(int)"010"

使用(int)010 之间转换整数值考虑格式化整数的各种方法。 010中的前导零表示数字为八进制表示法,使用(int)010将其转换为基数为10的十进制值8

这类似于使用0x10以十六进制(基数16)表示法编写的方式。使用(int)0x10会将其转换为基数10十进制值16,而使用(int)"0x10"将以小数值0结束:因为" x&#34 ;不是数值,之后的任何内容都将被忽略。

如果要将字符串"010"解释为八进制值,则需要指示PHP执行此操作。 intval("010", 8)将解释基数为8而不是默认基数10的数字,最终将得到小数值8。您还可以使用octdec("010")将八进制字符串转换为十进制值8。另一个选择是使用base_convert("010", 8, 10)显式转换数字" 010"从基数8到基数10,但此函数将返回字符串 "8"而不是整数8

答案 1 :(得分:3)

将字符串转换为整数遵循intval函数使用的逻辑:

  

使用指定的转换基数(默认值为10)返回var的整数值。

intval允许指定不同的基数作为第二个参数,而直接转换操作则不允许,因此使用(int)将始终将字符串视为基数10。

php > var_export((int) "010");
10
php > var_export(intval("010"));
10
php > var_export(intval("010", 8));
8

答案 2 :(得分:1)

func sendPushMessage(todoItem:TodoItem, isAdded:Bool = true) { let url = URL(string: "https://fcm.googleapis.com/fcm/send")! var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") let strKey:String = "Here FCM Server Key" request.setValue("key=\(strKey)", forHTTPHeaderField: "Authorization") var message:String = "" if isAdded { message = "Todo with title '\(todoItem.title)' added" } else{ message = "Todo with title '\(todoItem.title)' removed" } let dictData = ["to":"/topics/alldevices","priority":"high","notification":["body":message,"title":"Community","badge":"1"]] as [String : Any] do { let jsonData = try JSONSerialization.data(withJSONObject: dictData, options: .prettyPrinted) // here "jsonData" is the dictionary encoded in JSON data request.httpBody = jsonData let task = URLSession.shared.dataTask(with: request, completionHandler: { (responseData: Data?, response: URLResponse?, error: Error?) in let strData :String = String(data: responseData!, encoding: String.Encoding.utf8)! print("data : \(strData)") NSLog("\(String(describing: response) )") }) task.resume() } catch { print(error.localizedDescription) } } 开头的整数是八进制表示法。

0开头的整数(例如0x)表示十六进制表示法的整数和以0x2A开头的整数表示二进制表示法(例如0b)。

相关文档:DataFrame.drop_duplicates

答案 3 :(得分:0)

010被视为八进制数:

 010 = 0 x 8^0 + 1 x 8^1

有关详细信息,请查看intval documentation

答案 4 :(得分:-1)

PHP处理以零作为八进制开始的数字,因此这个结果是绝对正确的 您应该查找PHP Integers以获取有关此主题的更多信息。