it-swarm.asia

تحويل رقم بفاصلة كنقطة عشرية لتطفو

لدي قائمة أسعار بفاصلة للفاصلة العشرية ونقطة الفاصلة ألف.

بعض الأمثلة:

12،30
116،10
1.563،14

هذه تأتي في هذا الشكل من طرف ثالث. أريد تحويلها إلى عوامات وإضافتها معًا.

ما هي أفضل طريقة للقيام بذلك؟ number_format لا يبدو أنه يعمل مع هذا التنسيق ، و str_replace يبدو كأنه مبالغة ، حيث يتعين علي القيام بذلك أكثر من مرة واحدة على كل رقم.

هل هناك طريقة أفضل؟ شكر.

56
Aine

استخدام 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;

من شبه المؤكد أن هذه هي الطريقة الأقل كثافة لوحدة المعالجة المركزية التي يمكنك القيام بها ، والاحتمالات هي أنه حتى لو كنت تستخدم بعض الوظائف الفاخرة للقيام بذلك ، فإن هذا هو ما تفعله تحت الغطاء.

95
Teekin

إذا كنت تستخدم PHP5.3 أو أعلى ، فيمكنك استخدام numfmt_parse للقيام بـ "number_format معكوس". إذا لم تكن كذلك ، فأنت تمسك باستبدال التكرارات بـ preg_replace/str_replace.

16
Björn

يمكنك استخدام NumberFormatter class مع طريقة parse .

11
Gumbo

هذه الوظيفة متوافقة مع الأرقام ذات النقاط أو الفواصل مثل الكسور العشرية

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
7
Ramon

على افتراض أنهم في ملف أو صفيف ، فقط قم بإجراء الاستبدال كدفعة (على سبيل المثال ، دفعة واحدة):

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

ثم قم بمعالجة الأرقام من هناك مع الاستفادة الكاملة من طبيعة PHP المطبوعة بشكل فضفاض.

6
Paul Norman

قد تبدو مفرطة ولكن سيتم تحويل أي تنسيق معطى دون أي لغة:

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
4
Adrian Piechota

من PHP كتيب:

str_replace - استبدال كل تكرارات سلسلة البحث بسلسلة الاستبدال

أود أن أسلك هذا الطريق ، ثم أتحول من سلسلة إلى float - floatval

1
Yishai Landau