Chuỗi PHP để nổi


120

Tôi không quen thuộc với PHP chút nào và có một câu hỏi nhanh.

Tôi có 2 biến pricePerUnitInvoicedUnits. Đây là mã đang đặt các giá trị này thành các giá trị:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Nếu tôi xuất ra điều này, tôi sẽ nhận được các giá trị chính xác. Cho phép nói các 5000đơn vị được lập hóa đơn và 1.00để biết giá.

Bây giờ, tôi cần hiển thị tổng số tiền đã chi tiêu. Khi tôi nhân hai thứ này với nhau, nó không hoạt động (như mong đợi, đây là các chuỗi).

Nhưng tôi không biết cách phân tích cú pháp / ép kiểu / chuyển đổi các biến trong PHP.

Tôi nên làm gì?

Câu trả lời:


201
$rootbeer = (float) $InvoicedUnits;

Nên làm điều đó cho bạn. Kiểm tra Type-Juggling . Bạn cũng nên đọc Chuyển đổi chuỗi thành Số .


Đây là phương pháp đơn giản nhất .. nhưng đôi khi tôi gặp sự cố khi thực hiện việc này với một số cấu hình cơ sở dữ liệu nhất định và VARCHAR>11độ dài .. vẫn chưa thu hẹp được chính xác lý do tại sao.
Talvi Watia

2
^ đáng chú ý là (float) loại bỏ 0 từ chuỗi nếu đó là chữ số đầu tiên

Cũng lưu ý rằng "11,000.00" ý chí sản lượng 11 thay vì dự kiến 11.000,00
CodeJunkie

64

Bạn muốn chức năng không nhận biết ngôn ngữfloatval :

float floatval (hỗn hợp $ var) - Nhận giá trị float của một chuỗi.

Thí dụ:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343

4
kudos vì đã đề cập đến nhận thức về ngôn ngữ. Tôi chỉ cần bỏ ra theo dõi 1,5h ngã một vấn đề gây ra bởi địa phương khác nhau gây ra (float)để chuyển đổi trên máy chủ đầu tiên "" và ngày thứ hai tới ""
Tiến sĩ Gianluigi Zane Zanettini

23

Vâng, nếu người dùng viết 1,00,000 thì floatvar sẽ hiển thị lỗi. Vì thế -

floatval(preg_replace("/[^-0-9\.]/","",$input));

Điều này đáng tin cậy hơn nhiều.

Sử dụng :

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));

7
Thay vì ereg sử dụng preg $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
Vâng, ereg, Chức năng này đã được KHÔNG ĐƯỢC SỬ DỤNG. Vì vậy, nhu cầu sử dụng preg thay ereg :)
Hadi

9

Đối phó với đánh dấu trong phao là một nhiệm vụ không hề nhỏ. Trong ký hiệu tiếng Anh / Mỹ, bạn định dạng một nghìn cộng 46*10-2:

1,000.46

Nhưng ở Đức, bạn sẽ thay đổi dấu phẩy và trỏ:

1.000,46


Điều này làm cho nó thực sự khó đoán đúng số trong các ứng dụng đa ngôn ngữ.
Tôi thực sự khuyên bạn nên sử dụng Zend_MeasureZend Framework cho nhiệm vụ này. Thành phần này sẽ phân tích cú pháp chuỗi thành một float theo ngôn ngữ người dùng.


3
Ngày nay (+3 năm), người ta có thể sử dụng NumberFormatter kể từ PHP 5.3 với intlphần mở rộng.
zamnuts

1
PHP 5.3 đã có sẵn khi tôi trả lời câu hỏi, nhưng cho đến khi nhận xét của bạn, tôi không biết về chức năng đơn lẻ này vì có hàng tá thư viện đang làm điều gì đó tương tự. Nhưng chúng sẽ không có phạm vi ngôn ngữ tốt như phần mở rộng intl có. Cảm ơn, tôi sẽ cố gắng ghi nhớ nó.
Tobias P.

1

Sử dụng hàm này để ép giá trị float từ bất kỳ loại kiểu văn bản nào:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

Giải pháp này không phụ thuộc vào bất kỳ cài đặt ngôn ngữ nào. Do đó, người dùng có thể nhập giá trị float theo bất kỳ cách nào họ muốn. Điều này thực sự hữu ích, ví dụ như khi bạn có một dự án chỉ bằng tiếng Anh nhưng mọi người trên khắp thế giới đang sử dụng nó và có thể không nhớ rằng dự án muốn có một dấu chấm thay vì dấu phẩy cho các giá trị float. Bạn có thể ném javascript vào hỗn hợp và tìm nạp cài đặt mặc định của trình duyệt nhưng vẫn có nhiều người đặt các giá trị này thành tiếng Anh nhưng vẫn nhập 1,25 thay vì 1,25 (đặc biệt nhưng không giới hạn đối với ngành dịch thuật, nghiên cứu và CNTT)


bất kỳ nhận xét về lý do tại sao điều này là xấu / nó không thành công ở đâu?
Hafenkranich

hoặc có cách nào linh hoạt tương tự cách nào nhanh hơn không?
Hafenkranich

1
Nó sử dụng cờ e, "không còn được hỗ trợ". Đó là suy đoán của tôi.
Leif

0

Tôi đã gặp sự cố với cách chuẩn để thực hiện việc này:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

Nếu không có một số hợp lệ, trình phân tích cú pháp sẽ không trả về một số, nó sẽ gây ra lỗi. (Đây là điều kiện tôi đang cố gắng nắm bắt trong mã của mình, YMMV)

Để khắc phục điều này, tôi đã làm như sau:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

Sau đó, trước khi tiếp tục xử lý chuyển đổi, tôi có thể kiểm tra và trả về lỗi nếu không có phân tích cú pháp hợp lệ của chuỗi.


0

Nếu bạn cần xử lý các giá trị không thể chuyển đổi riêng biệt, bạn có thể sử dụng phương pháp này:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}

0

bạn có thể theo liên kết này để biết thêm về Cách chuyển đổi một chuỗi / số thành số / float / decimal trong PHP. ĐÂY LÀ NHỮNG GÌ LIÊN KẾT NÀY NÓI ...

Cách 1: Sử dụng hàm number_format (). Hàm number_format () được sử dụng để chuyển đổi một chuỗi thành một số. Nó trả về số được định dạng khi thành công, ngược lại nó trả về E_WARNING nếu thất bại.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Phương pháp 2: Sử dụng kiểu ép kiểu: Đánh máy có thể chuyển đổi trực tiếp một chuỗi thành kiểu nguyên thủy float, double hoặc integer. Đây là cách tốt nhất để chuyển một chuỗi thành một số mà không cần bất kỳ hàm nào.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Cách 3: Sử dụng hàm intval () và floatval (). Các hàm intval () và floatval () cũng có thể được sử dụng để chuyển đổi chuỗi thành các giá trị số nguyên và float tương ứng của nó.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Phương pháp 4: Bằng cách thêm 0 hoặc bằng cách thực hiện các phép toán. Số chuỗi cũng có thể được chuyển đổi thành số nguyên hoặc số thực bằng cách thêm 0 với chuỗi. Trong PHP, thực hiện các phép toán, chuỗi được chuyển đổi ngầm định thành số nguyên hoặc float.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.