漂浮的 PHP 字符串

我对 PHP 一点也不熟悉,有一个很快的问题。

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

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

如果我输出这个,我得到正确的值。让我们说 5000发票单位和价格的 1.00

现在,我需要显示花费的总金额。当我把这两个字符串相乘时,它们不起作用(正如预期的那样,它们是字符串)。

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

我该怎么办?

465428 次浏览
$rootbeer = (float) $InvoicedUnits;

应该为你这样做。检查 类型杂耍。你也应该读 字符串转换为数字

你想要 非区域设置感知的 floatval函数:

Float floatval (混合 $var)-获取字符串的 float 值。

例如:

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

如果用户输入1,000,000,floatvar 将显示错误,所以-

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

这个更可靠。

用法:

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

处理浮点数中的标记是一项非常重要的任务。在英/美符号中,格式化为1000加 46*10-2:

1,000.46

但在德国,你可以改变逗号并指出:

1.000,46


这使得在多语言应用程序中猜测正确的数字变得非常困难。
我强烈建议在此任务中使用 Zend 框架的 Zend_Measure。该组件将通过用户语言将字符串解析为浮点数。

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

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

此解决方案不依赖于任何区域设置。因此,对于用户输入,用户可以按照自己喜欢的方式键入 float 值。这是非常有用的,例如,当你有一个项目,它只是英文的,但是全世界的人都在使用它,并且可能没有想到这个项目需要一个点而不是一个用于浮点值的逗号。 你可以把 javascript 混合在一起,获取浏览器的默认设置,但仍然有很多人将这些值设置为英语,但仍然键入1.25而不是1.25(特别是但不限于翻译行业,研究和 IT)

我遇到了一个标准方法的问题:

$string = "one";


$float = (float)$string;


echo $float; : ( Prints 0 )

如果没有有效的数字,解析器不应该返回数字,它应该抛出一个错误。(这是我试图在我的代码 YMMV 中捕捉到的一种情况)

为了解决这个问题,我采取了以下措施:

$string = "one";


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


echo $float; : ( Prints nothing )

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

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

try {
// use + 0 if you are accounting in cents
$doubleValue = trim($stringThatMightBeNumeric) + 0.0;
} catch (\Throwable $th) {
// bail here if you need to
}

您可以按照这个 链接了解更多关于如何在 PHP 中将字符串/数字转换为数字/浮点数/小数的信息。 这个链接是这么说的..。

方法1: 使用 number _ format ()函数。Number _ format ()函数用于将字符串转换为数字。它在成功时返回格式化的数字,否则在失败时给出 E _ WARWN。

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

为了完整起见,虽然这个问题是古老的,值得一提的是 filter_var()的一组函数,它们不仅应该处理格式化位本身,而且还应该验证或清理输出,因此在用户填写表单的上下文中使用更安全(或者,最终,也许吧有一些损坏/不一致的字段的数据库) :

$InvoicedUnits = (float) filter_var($InvoiceLineItem->InvoicedUnits,
FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$pricePerUnit  = (float) filter_var($InvoiceLineItem->PricePerUnit,
FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));


printf("The total is: %.2f\n", $InvoicedUnits * $pricePerUnit); // both are now floats and the result is a float, formatted to two digits after the decimal sign.


这个 清洁剂输出(它仍然是一个字符串) 还有将接受当前语言环境的小数点设置(例如点对逗号) ,而且,在 确认的 PHP 手册中有更多的选项(如果有效,它将自动将结果转换为 float)。对于不同的场景,结果会略有不同ーー例如,如果你事先知道 $InvoiceLineItem只有浮点数的有效数字和符号,或者如果你需要首先“清理”字段,去掉空格和杂散字符(比如货币符号!)等等。

最后,如果希望获得格式良好的输出ーー因为总数是用 货币表示的ーー那么还应该查看内置的 NumberFormatter,然后执行以下操作:

$InvoicedUnits = (float) filter_var($InvoiceLineItem->InvoicedUnits,
FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$pricePerUnit  = (float) filter_var($InvoiceLineItem->PricePerUnit,
FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));


$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
echo 'Total is: ' . $fmt->formatCurrency($InvoicedUnits * $pricePerUnit, 'EUR') . PHP_EOL;

这还将根据所配置的区域设置处理成千上万个分隔符(空格、点、逗号... ...) ,以及其他类似的花哨的东西。

此外,如果您愿意,您可以使用 ''(空字符串)作为默认的语言环境字符串(由服务器或浏览器可选地设置)和 $fmt->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL)来获得默认的3个字母的货币代码(这可能不是您想要的,因为 通常的价格是以 具体点货币给出的ーー这些函数确实 没有考虑了货币汇率!).