Program Tip

쉼표가있는 숫자를 소수점으로 부동 소수점으로 변환

programtip 2020. 12. 10. 21:00
반응형

쉼표가있는 숫자를 소수점으로 부동 소수점으로 변환


소수점에 쉼표가 있고 천 단위 구분 기호로 점이있는 가격 목록이 있습니다.

몇 가지 예 :

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 집약적 인 방법이고, 당신이 그것을하기 위해 어떤 멋진 기능을 사용하더라도 이것이 그것이 내부에서하는 일이라는 것입니다.


PHP5.3 이상을 사용하는 경우 numfmt_parse사용 하여 "역 번호 형식"을 수행 할 수 있습니다 . 그렇지 않은 경우 발생을 preg_replace / str_replace로 바꾸는 데 고착했습니다.


NumberFormatter 클래스 를 해당 parse메서드 와 함께 사용할 수 있습니다 .


이 기능은 소수점이나 쉼표가있는 숫자와 호환됩니다.

function floatvalue($val){
            $val = str_replace(",",".",$val);
            $val = preg_replace('/\.(?=.*\.)/', '', $val);
            return floatval($val);
}
$number = "1.325.125,54";
echo floatvalue($number); // The output is 1325125.54
$number = "1,325,125.54"; 
echo floatvalue($number); // The output is 1325125.54

파일이나 배열에 있다고 가정하면 일괄 (즉, 한꺼번에) 바꾸기 만 수행합니다.

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

그런 다음 PHP의 느슨하게 입력 된 특성을 최대한 활용하여 거기에서 숫자를 처리합니다.


과도하게 보일 수 있지만 로케일에 관계없이 주어진 형식을 변환합니다.

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

PHP 매뉴얼에서 :

str_replace — 모든 검색 문자열을 대체 문자열로 대체합니다.

I would go down that route, and then convert from string to float - floatval

참고URL : https://stackoverflow.com/questions/4325363/converting-a-number-with-comma-as-decimal-point-to-float

반응형