Конвертирование строк в формате money в числа с плавающей точкой - PullRequest
3 голосов
/ 22 июня 2011

Мне нужно прочитать довольно большой файл, содержащий числа, отформатированные по-разному.

Я пытался использовать встроенную функцию floatval () . Эта функция работает с некоторыми числами, такими как 22000.76, но не 22000,76.

Чтение комментариев на php.net мне очень помогло, я нашел эту функцию parseFloat:

<?php 
function parseFloat($ptString) { 
        if (strlen($ptString) == 0) { 
                return false; 
        } 

        $pString = str_replace(" ", "", $ptString); 

        if (substr_count($pString, ",") > 1) 
            $pString = str_replace(",", "", $pString); 

        if (substr_count($pString, ".") > 1) 
            $pString = str_replace(".", "", $pString); 

        $pregResult = array(); 

        $commaset = strpos($pString,','); 
        if ($commaset === false) {$commaset = -1;} 

        $pointset = strpos($pString,'.'); 
        if ($pointset === false) {$pointset = -1;} 

        $pregResultA = array(); 
        $pregResultB = array(); 

        if ($pointset < $commaset) { 
            preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA); 
        } 
        preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB); 
        if ((isset($pregResultA[0]) && (!isset($pregResultB[0]) 
                || strstr($preResultA[0],$pregResultB[0]) == 0 
                || !$pointset))) { 
            $numberString = $pregResultA[0]; 
            $numberString = str_replace('.','',$numberString); 
            $numberString = str_replace(',','.',$numberString); 
        } 
        elseif (isset($pregResultB[0]) && (!isset($pregResultA[0]) 
                || strstr($pregResultB[0],$preResultA[0]) == 0 
                || !$commaset)) { 
            $numberString = $pregResultB[0]; 
            $numberString = str_replace(',','',$numberString); 
        } 
        else { 
            return false; 
        } 
        $result = (float)$numberString; 
        return $result; 
} 
?> 

Он работает почти на всех числах в моем списке. Поскольку я использую DKK в качестве валюты, некоторые числа имеют следующий формат: Kr. 100.00. Эту проблему я решил просто поместить эти строки в начало функции parseFloat.

$prefix = substr($ptString, 0, 4); 
if ($prefix == "kr. " || $prefix == "Kr. ")
    $ptString = substr($ptString,4);

$prefix = substr($ptString, 0, 3); 
if ($prefix == "Kr." || $prefix == "kr.")
    $ptString = substr($ptString,3);

Теперь моя проблема возникает только с числами, отформатированными как 12.123.00, которые должны быть 12123.00

Я думаю это можно решить с помощью регулярных выражений (не моей силы).

По сути, я прошу преобразовать xx.xxx.dd в xxxxx.dd.

Не думайте о вопросах округления.

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

NumberFormatter имеет метод parseCurrency(), который может оказаться полезным.

1 голос
/ 22 июня 2011

Если все ваши проблемы связаны с преобразованием из xx.xxx.dd в xxxxx.dd, нет необходимости использовать механизм регулярных выражений, вы можете просто использовать функцию explode (), например:

$n = "123.456.78";
$a = explode(".", $n);

if(sizeof($a)==3) //had more than one dot
  $n = $a[0].$a[1].".".$a[2];

//$n now is 123456.78
1 голос
/ 22 июня 2011

, если цифры всегда имеют дробь (пенсов, центов и т. Д.) .. попробуйте этот хак:

$value = (float)preg_replace('/\D/', '', $strToParse)/100;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...