【问题标题】:PHP working with money from different localesPHP 使用来自不同地区的资金
【发布时间】:2015-08-17 16:13:31
【问题描述】:

我不能使用money_formatNumberFormatter 类。 我让用户可以定义他们想要使用的小数分隔符 - 逗号或点。

// , or .
$decimal_separator = getUserDecimalSeparator();

现在,用户可以在input 字段中引入以下值:

1,200.10
1.500,21
1,50
1.35
1500.10
1900,21

我需要对这些值进行格式化以正确插入数据库。我在数据库中的字段是double(10,2)

为了处理用户插入的值,我希望将它们转换为(始终使用点作为小数分隔符,并且没有千位分隔符):

1200.10
1500.21
1.50
1.35
1500.10
1900.21

所以我想到了一个可以帮助我转换值的函数。

function formatMoneyToDatabase($value, $separator)
{
    $value = str_replace('.', ',', $value); 

    if($separator == ',')
        return number_format($value, 2, '.', '');

    return number_format($value, 2, ',', '');
}

但这不起作用有几个原因:

  1. 该值可能有两个、三个或更多分隔符(1.000.000,50 或 1,000,000.50)
  2. 我需要识别值的分隔符
  3. 我需要验证该值是否有任何十进制值

【问题讨论】:

  • 1.使用正则表达式删除所有分隔符。 2. number_format() 使用用户指定的适当分隔符。

标签: php money-format


【解决方案1】:

解决了,我相信。

我在 stackoverflow 中找到了一个解决方案,因为我丢失了链接,所以无法链接到该解决方案,但解决方案是通过正则表达式。

if(!function_exists('formatMoneyToDatabase'))
{
    function formatMoneyToDatabase($value)
    {
        return preg_replace('/[^\d]/', '', $value) / 100;
    }
}

100,000,000.12 -> 100000000.12
75.000,12      -> 75000.12
50.000.000     -> 50000000
12,000,000     -> 12000000

注意:我之前已经在另一个正则表达式函数中验证了价格。

return preg_match('/^[0-9]+(?:\.[0-9]{2,' . $decimal_places . '}+)?$/', $price);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-23
    • 2016-05-03
    • 1970-01-01
    • 2022-01-20
    • 2019-09-30
    • 2021-12-16
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多