2011-01-02 41 views
12

Tôi cần trợ giúp chuyển đổi chuỗi chứa số trong ký hiệu khoa học thành gấp đôi.Chuyển đổi một chuỗi có chứa một số trong ký hiệu khoa học thành một đôi trong PHP

Ví dụ chuỗi: "1.8281e-009" "2.3562e-007" "0,911348"

Tôi đã suy nghĩ về chỉ phá vỡ số vào số ở bên trái và số mũ và không chỉ làm toán học để tạo ra số; nhưng có cách nào tốt hơn/tiêu chuẩn để làm điều này?

Trả lời

10

PHP là typeless được nhập động, nghĩa là phải phân tích các giá trị để xác định loại của chúng (phiên bản PHP gần đây có type declarations).

Trong trường hợp của bạn, bạn có thể chỉ cần thực hiện phép toán số để buộc PHP xem xét các giá trị dưới dạng số (và nó hiểu ký hiệu khoa học x.yE-z).

Hãy thử ví dụ

foreach (array("1.8281e-009","2.3562e-007","0.911348") as $a) 
    { 
    echo "String $a: Number: " . ($a + 1) . "\n"; 
    } 

chỉ cần thêm 1 (bạn cũng có thể trừ zero) sẽ làm cho các dây trở thành con số, với số tiền phải của số thập phân.

Kết quả:

String 1.8281e-009: Number: 1.0000000018281 
    String 2.3562e-007: Number: 1.00000023562 
    String 0.911348: Number: 1.911348 

Bạn cũng có thể đúc kết quả sử dụng (float)

$real = (float) "3.141592e-007"; 
+4

Nó không phải là không có kiểu chữ. Bạn vẫn có thể phân biệt giữa (ví dụ) chuỗi và int với 'is_string' và' is_int'. Nó được nhập động, với rất nhiều chuyển đổi tiềm ẩn. Ngoài ra, đây là một câu trả lời hay. –

+0

oh, không biết php hiểu ký hiệu khoa học. Đây chính xác là những gì tôi cần. Cảm ơn –

+0

@Matthew Tôi đã nói * lập trình khôn ngoan *. Khi lập trình, bạn không có đặc biệt quan tâm đến các loại. Tất nhiên, các loại cửa hàng PHP nội bộ. * Tự động gõ * là thích hợp hơn - nhưng tôi không chắc chắn một người mới bắt đầu sẽ hiểu rằng định nghĩa tốt hơn. –

9
$f = (float) "1.8281e-009"; 
var_dump($f); // float(1.8281E-9) 
1
$float = sprintf('%f', $scientific_notation); 
$integer = sprintf('%d', $scientific_notation); 
if ($float == $integer) 
{ 
    // this is a whole number, so remove all decimals 
    $output = $integer; 
} 
else 
{ 
    // remove trailing zeroes from the decimal portion 
    $output = rtrim($float,'0'); 
    $output = rtrim($output,'.'); 
} 
2

Tiếp theo dòng mã có thể giúp bạn để hiển thị giá trị bigint,

$token= sprintf("%.0f",$appdata['access_token']); 

tham chiếu đến điều này link.

3

Tôi tìm thấy một bài mà sử dụng number_format để chuyển đổi các giá trị từ một số float ký hiệu khoa học đối với một số ký hiệu phi khoa học:

http://jetlogs.org/2008/02/05/php-problems-with-big-integers-and-scientific-notation/

Chú ý: Link là thối

Ví dụ từ bài đăng:

$big_integer = 1202400000; 
$formatted_int = number_format($big_integer, 0, '.', ''); 
echo $formatted_int; //outputs 1202400000 as expected 

HTH

+4

[Liên kết của bạn đã chết] (http://jetlogs.org/2008/02/05/php-problems-with-big-integers-and-scientific-notation/) ... 404 – Sparky

0

Sử dụng các chức năng number_format()rtrim() cùng nhau. Ví dụ:

//eg $sciNotation = 2.3649E-8 
$number = number_format($sciNotation, 10); //Use $dec_point large enough 
echo rtrim($number, '0'); //Remove trailing zeros 

Tôi tạo ra một chức năng, với các chức năng hơn (chơi chữ không có ý định)

function decimalNotation($num){ 
    $parts = explode('E', $num); 
    if(count($parts) != 2){ 
     return $num; 
    } 
    $exp = abs(end($parts)) + 3; 
    $decimal = number_format($num, $exp); 
    $decimal = rtrim($decimal, '0'); 
    return rtrim($decimal, '.'); 
} 
0
function decimal_notation($float) { 
     $parts = explode('E', $float); 

     if(count($parts) === 2){ 
      $exp = abs(end($parts)) + strlen($parts[0]); 
      $decimal = number_format($float, $exp); 
      return rtrim($decimal, '.0'); 
     } 
     else{ 
      return $float; 
     } 
    } 

làm việc với 0.000077240388

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