簡體   English   中英

將逗號作為小數點的數字轉換為浮點數

[英]Converting a number with comma as decimal point to float

我有一個價格列表,用逗號作為小數點,用點作為千位分隔符。

一些例子:

12,30
116,10
1.563,14

這些來自第三方的這種格式。 我想將它們轉換為浮點數並將它們加在一起。

做這個的最好方式是什么? number_format似乎不適用於這種格式,而str_replace似乎有點矯枉過正,因為我必須對每個數字多做一次。

有沒有更好的辦法? 謝謝。

使用str_replace()刪除點並不過分。

$string_number = '1.512.523,55';
// NOTE: You don't really have to use floatval() here, it's just to prove that it's a legitimate float value.
$number = floatval(str_replace(',', '.', str_replace('.', '', $string_number)));

// At this point, $number is a "natural" float.
print $number;

這幾乎可以肯定是您可以執行此操作的 CPU 密集程度最低的方法,並且很可能即使您使用一些奇特的函數來執行此操作,這也是它在幕后所做的事情。

此功能兼容以點或逗號為小數的數字

function floatvalue($val){
            $val = str_replace(",",".",$val);
            $val = preg_replace('/\.(?=.*\.)/', '', $val);
            return floatval($val);
}

這適用於所有類型的輸入(美式或歐式)

echo floatvalue('1.325.125,54'); // The output is 1325125.54
echo floatvalue('1,325,125.54'); // The output is 1325125.54
echo floatvalue('59,95');        // The output is 59.95
echo floatvalue('12.000,30');    // The output is 12000.30
echo floatvalue('12,000.30');    // The output is 12000.30

如果您使用的是 PHP5.3 或更高版本,則可以使用numfmt_parse來執行“反轉 number_format”。 如果你不是,你就堅持用 preg_replace/str_replace 替換出現的次數。

您可以使用NumberFormatter及其parse方法

可能看起來過多,但無論語言環境如何,都會轉換任何給定的格式:

function normalizeDecimal($val, int $precision = 4): string
{
    $input = str_replace(' ', '', $val);
    $number = str_replace(',', '.', $input);
    if (strpos($number, '.')) {
        $groups = explode('.', str_replace(',', '.', $number));
        $lastGroup = array_pop($groups);
        $number = implode('', $groups) . '.' . $lastGroup;
    }
    return bcadd($number, 0, $precision);
}

輸出:

.12           -> 0.1200
123           -> 123.0000
123.91        -> 12345678.9100
123 456 78.91 -> 12345678.9100
123,456,78.91 -> 12345678.9100
123.456.78,91 -> 12345678.9100
123 456 78,91 -> 12345678.9100

假設它們在文件或數組中,只需將替換作為批處理(即一次全部執行):

$input = str_replace(array('.', ','), array('', '.'), $input); 

然后從那里處理數字,充分利用 PHP 的松散類型特性。

來自 PHP 手冊:

str_replace — 用替換字符串替換所有出現的搜索字符串

我會沿着那條路線走,然后從字符串轉換為浮點數 - floatval

對於那些想要NumberFormatter示例的人:

    $test='2,345.67';

//  OOP Version
    $numberFormatter=new NumberFormatter('en-AU',NumberFormatter::DECIMAL);
    $number=$numberFormatter->parse($test);
    print $number;

//  Procedural Version
    $numberFormatter=numfmt_create('en_AU',NumberFormatter::DECIMAL);
    $number=numfmt_parse($numberFormatter,$test);
    print $number;

當然你的語言環境可能非常。

不知道為什么有人會選擇程序版本。

請注意, NumberFormatstr_replace類型解決方案之間的一個主要區別是NumberFormatter對您放置千位和十進制字符的位置很敏感; 使用1,2345.00不起作用。

您可以使用filter_var

$floatNumber = (float) filter_var($string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM