【问题标题】:setlocale to fr-FR in PHP and number formatting在 PHP 中将区域设置为 fr-FR 和数字格式
【发布时间】:2011-02-23 18:44:30
【问题描述】:

我正在尝试创建我的一个网站的法语版本。我在页面顶部设置了setlocale(LC_ALL, 'fr_FR');,并使用strftime 以法式风格正确显示日期。

但是我遇到了一些问题。该页面的一部分使用了我从 Web 服务获取的数据。我将返回值分配给这样的 var:

$overallRating = $returnArray['Overall'];

我稍后使用以下代码将其格式化为小数点后 1 位

number_format($overallRating,1)

在英文版中,overallRating 值可能是7.5,并返回一个值,例如7.5(通过number_format 运行它的原因是如果它返回7,我希望它显示7.0

但是在法语版本中,如果我打印出原始的 $overallRating 值,我会得到 7,5,看起来它已将其翻译成法语。这很好,但如果我通过number_format 运行它,我会收到错误:

Notice: A non well formed numeric value encountered in /sites/index.php  on line 250

第 250 行是 number_format

我猜想7,5 的翻译搞砸了,但不知道如何解决这个问题...

使用 PHP 5.3 以防有任何新的帮助我

【问题讨论】:

  • 这听起来像你的值在其他地方得到了 number_formatted。你100%确定这不会发生吗?你能一步一步追踪值在什么时候被转换吗?
  • 虽然我没有在此之前对数字进行 number_formating,但我认为 setlocale 正在翻译它,正如我在问题中所说,如果我在通过 number_format 运行它之前打印出法语页面中的 $overallRating显示 7,5(带逗号)。我想这会导致 number_format 失败?

标签: php locale number-formatting


【解决方案1】:

我想获取一个像“54,33”这样的法语编辑字符串并将其作为 en_US 数字保存回数据库,因为正如已经指出的那样,PHP 真的只喜欢 en_US 格式的数字。我没有看到任何内置的 PHP 转换函数,所以构建了它来完成这项工作。删除千位分隔符并将小数分隔符替换为“。”它旨在与任何设置一起使用。

//Currency Conversion Back to US for DB Storage or PHP number formatting
function number_convert_us($num) {
    $locale_settings = localeconv();
    $num = str_replace($locale_settings['mon_thousands_sep'], "", trim($num));
    $num = str_replace($locale_settings['mon_decimal_point'], ".", $num);
    return number_format((double)$num, 2, '.', '');
}

我将为 JavaScript 构建一个类似的东西。找到这个库进行展示:http://software.dzhuvinov.com/jsworld-currency-formatting.html

【讨论】:

    【解决方案2】:

    所以经过大量研究最终找到了答案。

    PHP 仅适用于标准的美国十进制分隔符,无法处理法语 , 分隔符。

    虽然不完美,但答案是重置数值以使用美国,同时允许日期等以法语格式化。放置此行:

     setlocale(LC_NUMERIC, 'C');
    

     setlocale(LC_ALL, 'fr_FR'); 
    

    成功了

    【讨论】:

      【解决方案3】:

      这是你要问的吗?

      <?php
          $overallRating = number_format($number, 1, '.', '');
      ?>

      稍后编辑:

      <?php
      setlocale(LC_ALL, 'fr_FR');
      $number = '7';
      echo $overallRating = number_format($number, 1, '.', '');
      ?>

      【讨论】:

      • 尝试在数字中加上小数,这似乎是问题所在。即 7.5 而不是 7
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2020-03-30
      • 2010-10-01
      • 2011-01-31
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多