【问题标题】:PHP String to FloatPHP字符串浮动
【发布时间】:2009-01-26 21:32:22
【问题描述】:

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

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

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

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

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

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

我该怎么办?

【问题讨论】:

    标签: php string casting floating-point


    【解决方案1】:
    $rootbeer = (float) $InvoicedUnits;
    

    应该为你做。查看Type-Juggling。您还应该阅读String conversion to Numbers

    【讨论】:

    • 它是最简单的方法.. 但有时我会在某些数据库配置和VARCHAR>11 长度上遇到问题.. 还没有确切地缩小原因。
    • ^值得注意的是(float)如果它是第一个数字,则从字符串中删除0
    • 另请注意,“11,000.00”将输出 11 而不是预期的 11000.00
    【解决方案2】:

    你想要non-locale-aware floatval function:

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

    例子:

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

    【讨论】:

    • 感谢提及语言环境意识。我刚刚花了 1.5 小时追踪由不同语言环境引起的问题,导致 (float) 在第一台服务器上转换为“,”,在第二台服务器上转换为“,”
    【解决方案3】:

    好吧,如果用户写入 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));
    

    【讨论】:

    • 而不是 ereg 使用 preg $string=preg_replace("/[^0-9\.\-]/","",$string);
    • 是的,例如,此功能已被弃用。所以需要使用 preg 代替 ereg :)
    • @HADI 很高兴为我工作。非常感谢亲爱的
    • 字符类中的. 不需要转义。
    【解决方案4】:

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

    1,000.46
    

    但在德国,你会改变逗号和点:

    1.000,46
    


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

    【讨论】:

    • 现在(+3 年),从 PHP 5.3 开始,可以使用 NumberFormatterintl 扩展名。
    • 当我回答这个问题时,PHP 5.3 已经可用,但在您发表评论之前,我并不知道这个单一功能,因为有几十个库在做类似的事情。但是它们不会像 intl 扩展那样对语言环境有很好的覆盖。谢谢,我会努力记住的。
    【解决方案5】:

    您可以关注link 了解更多关于如何在 PHP 中将字符串/数字转换为数字/浮点数/十进制。 这就是这个链接所说的......

    方法一:使用 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;
    

    【讨论】:

    • 添加在每种情况下将收到的输出作为评论将有很大帮助,而我们不必测试每种情况
    【解决方案6】:

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

    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)

    【讨论】:

    • 任何关于为什么这不好/哪里失败的问题?
    • 或者有没有更快的灵活方式?
    • 它使用“不再支持”的 e 标志。这是我的猜测。
    【解决方案7】:

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

    $string = "one";
    
    $float = (float)$string;
    
    echo $float; : ( Prints 0 )
    

    如果没有有效数字,解析器不应该返回数字,它应该抛出错误。 (这是我试图在我的代码中捕获的条件,YMMV)

    为了解决这个问题,我做了以下事情:

    $string = "one";
    
    $float = is_numeric($string) ? (float)$string : null;
    
    echo $float; : ( Prints nothing )
    

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

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 2022-07-20
        • 2022-01-21
        • 1970-01-01
        • 2014-08-07
        • 2012-12-17
        相关资源
        最近更新 更多