PHP字符串浮动


120

我一点都不熟悉PHP,并且有一个简短的问题。

我有2个变量pricePerUnitInvoicedUnits。这是将这些设置为值的代码:

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

如果输出,则得到正确的值。可以说5000发票单位和1.00价格。

现在,我需要显示花费的总额。当我将这两个数相乘时,它不起作用(按预期,它们是字符串)。

但是我不知道如何在PHP中解析/广播/转换变量。

我该怎么办?

Answers:


201
$rootbeer = (float) $InvoicedUnits;

应该为你做。查看Type-Juggling。您还应该阅读将String转换为Numbers


它是最简单的方法..但是有时我在使用某些数据库配置和VARCHAR>11长度进行操作时遇到了问题。尚未确切地说明原因。
Talvi Watia

2
值得一提的是,^(float)从字符串中删除0(如果它是第一个数字)

另请注意,“ 11,000.00”将输出11而不是预期的11000.00
CodeJunkie

64

您需要非语言环境感知floatval功能

float floatval(mixed $ var)-获取字符串的float值。

例:

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

4
提及区域意识的荣誉。我只是花了1.5小时来追踪由不同语言环境引起的问题,该问题导致(float)第一台服务器上的服务器转换为“,”,第二台服务器上的服务器转换为“,”
Gianluigi Zane Zanettini博士

23

好吧,如果用户写入1,00,000,则floatvar将显示错误。所以-

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

这更加可靠。

用法:

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

7
代替ereg使用预浸料 $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza 2012年

4
是的,ereg,此功能已被弃用。因此需要使用preg代替ereg :)
HADI

9

处理浮点数中的标记不是一件容易的事。在英语/美国记法中,您格式化一千个加号46*10-2

1,000.46

但是在德国,您会更改逗号并指出:

1.000,46


这使得很难在多语言应用程序中猜测正确的数字。
我强烈建议Zend_Measure将Zend Framework用于此任务。该组件将根据用户语言将字符串解析为浮点数。


3
如今(+3年),从PHP 5.3开始,可以使用NumberFormatter及其intl扩展名。
zamnuts

1
当我回答问题时,PHP 5.3可用了,但是直到您发表评论时,我才意识到这一功能,因为有数十个库在执行类似的操作。但是它们不会像intl扩展那样对语言环境有足够的了解。谢谢,我会尽力记住它。
Tobias P.

1

使用此函数可从任何类型的文本样式强制转换浮点值:

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

此解决方案不依赖于任何语言环境设置。因此,对于用户输入,用户可以按自己喜欢的任何方式键入浮点值。这确实很有用,例如,当您有一个仅用英语编写的项目,但世界各地的人们都在使用它,并且可能不会想到该项目需要点而不是逗号来表示浮点值时。您可以混合使用javascript并获取浏览器的默认设置,但是仍然有很多人将这些值设置为英语,但仍然输入1.25而不是1.25(特别是但不限于翻译行业,研究和IT)


关于这为什么不好/在哪里失败的任何评论?
Hafenkranich

还是有同样灵活的方法更快?
Hafenkranich

1
它使用“不再受支持”的e标志。那是我的猜测。
雷夫

0

我遇到了执行此操作的标准方法的问题:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

如果没有有效的数字,则解析器不应返回数字,而应引发错误。(这是我要抓住我的代码YMMV的条件)

为了解决这个问题,我做了以下工作:

$string = "one";

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

echo $float; : ( Prints nothing )

然后,在进一步处理转换之前,如果没有有效的字符串解析,我可以检查并返回错误。


0

如果需要处理无法单独转换的值,则可以使用以下方法:

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

0

您可以通过此链接了解有关如何在PHP中将字符串/数字转换为数字/浮点数/小数的更多信息。这是链接的意思...

方法1:使用number_format()函数。number_format()函数用于将字符串转换为数字。成功时返回格式化的数字,否则返回E_WARNING。

$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); 

方法2:使用类型转换:类型转换可以将字符串直接转换为浮点,双精度或整数原始类型。这是将字符串转换为没有任何功能的数字的最佳方法。

// 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; 

方法3:使用intval()和floatval()函数。intval()和floatval()函数还可用于将字符串分别转换为其相应的整数和浮点值。

// 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); 

方法4:通过加0或执行数学运算。通过将字符串加0,也可以将字符串号转换为整数或浮点数。在PHP中,执行数学运算时,字符串将隐式转换为整数或浮点数。

// 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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.