2012-09-26 42 views
9

Tôi có một vấn đề bất thường mà tôi không có ý tưởng làm thế nào để giải quyết.Echo một số rất lớn

Tôi có một tập tin JSON, nơi một id ứng dụng được lưu trữ, cụ thể là như sau:

"app_id": "363924477024846" 

tôi đọc tệp JSON của tôi từ HDD và phân tích nó với json_decode() để sử dụng nó trong ứng dụng của tôi. Tuy nhiên, tại một thời điểm, tôi muốn có id ứng dụng được gửi đến trình duyệt. Vấn đề là, nếu tôi lặp lại biến đó, nó được in như sau:

2.7110712626725E+14 

Có cách nào để ngăn chặn điều này không? Tôi không cần nó bị đe dọa như một con số bởi PHP vì tôi không thực hiện bất kỳ phép tính nào với nó - một chuỗi sẽ ổn thôi. Nhưng vì nó chỉ được biểu diễn bằng số, có vẻ như json_decode() đe dọa nó như một con số, thậm chí khó khăn tôi đặt dấu ngoặc kép xung quanh nó (nên chỉ ra một chuỗi) hoặc có thể PHP chỉ làm gợi ý kiểu ngu ngốc trong trường hợp này, tôi không biết ...

Bất kỳ ý tưởng nào về cách xử lý điều đó?

+0

Tôi chưa thử nghiệm, nhưng nếu bạn sử dụng 'sprintf', ví dụ: '$ foo = sprintf ("% d ", $ bar); echo $ foo; '? – slugonamission

+0

Điều này là do giới hạn của số nguyên được ký 32 bit. – clentfort

+0

@slugonamission: Điều này sẽ in "2147483647" trên màn hình với app_id được sử dụng ở trên. –

Trả lời

16

tôi đã cùng một vấn đề ở đây: Đơn giản chỉ cần sử dụng PHPs chức năng number_format, mà giải quyết vấn đề này:

$number = "363924477024846"; 
echo number_format($number, 0, '', ''); 

// 363924477024846 
+0

Đã hoạt động! Cảm ơn, người đàn ông :) Tôi sẽ chấp nhận câu trả lời của bạn khi tôi có thể trong 9 phút. –

+0

Bạn được chào đón :) – sics

1

thử đúc nó thành một chuỗi

echo((string)$theNumber); 
+0

Đã cố gắng rằng, nó vang vọng cùng một đầu ra. –

+0

thử var_dumping dữ liệu và cập nhật câu hỏi của bạn với nó xin vui lòng. Điều đó có thể giúp chúng tôi ra một số –

+0

Dường như vấn đề phát sinh tại thời điểm giá trị được giải mã từ chuỗi JSON. Đó là khi nó được xử lý như một số nguyên, do đó, nó cắt ngắn đến giá trị tối đa cho một số nguyên 32-bit và sau đó, giá trị ban đầu không thể được phục hồi. – octern

1

Một giải pháp nhanh chóng và bẩn sẽ có thêm một số nhân vật ở đầu hoặc cuối của số điện thoại để buộc PHP để đối xử với nó như là một chuỗi. Có thể intstead của "363924477024846" sử dụng "z363924477024846" và sau đó loại bỏ z khi bạn cần sử dụng nó. Rõ ràng nối thêm điều này trước khi bạn gửi nó.

+2

Điều đó cũng xuất hiện trong đầu tôi. Nhưng điều đó có nghĩa là có một tệp JSON "bẩn" được lưu trữ. Ngoài ra, rất có khả năng ai đó tạo một cấu hình JSON mới sẽ quên điều đó trong tương lai. –

0

Nếu bạn có thể thay đổi nội dung tệp JSON, có bạn đã cố gắng gói ID ứng dụng trong dấu ngoặc kép, như vậy :

"app_id": "'363924477024846'" 

như clentfort đã nói, bạn đang vượt quá giá trị tối đa cho một số nguyên 32bit (~ 2,1 tỷ đã ký)

4

Dường như json_decode có một tùy chọn để xử lý các số nguyên lớn dưới dạng chuỗi.

json_decode($json, false, 512, JSON_BIGINT_AS_STRING) 
+1

Đây phải là câu trả lời, các số nguyên lớn có thể vẫn được làm tròn trên các hệ thống 32 bit. Điều này làm việc khi câu trả lời được chấp nhận không. – sunshinekitty

Các vấn đề liên quan