ฉันจะแปลงสตริงเป็นตัวเลขใน PHP ได้อย่างไร


670

ฉันต้องการที่จะแปลงเหล่านี้ประเภทของค่านิยม'3', '2.34', '0.234343'ฯลฯ จำนวน ใน JavaScript เราสามารถใช้Number()แต่มีวิธีการที่คล้ายกันใน PHP?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545

63
ผู้อ่านระวัง: ไม่มีคำตอบที่แท้จริงสำหรับคำถามนี้ :(
Matthieu Napoli

@ MatthieuNapoli คำตอบก็คือโดยปกติแล้ว Php จะคิดออกมาเพื่อคุณ - หนึ่งในข้อดีของระบบการพิมพ์แบบไดนามิก
Kolob Canyon

12
ด้วยโซ่แห่งความไม่แน่นอนและ 'มักจะ'
person27

2
@MatthieuNapoli การคัดเลือกนักแสดงไม่ใช่คำตอบที่แท้จริง? คุณสามารถตรวจสอบประเภทหลังจากพิมพ์ได้หากคุณต้องการเป็นเด็กเกี่ยวกับเรื่องนี้
Kolob Canyon

3
@ MatthieuNapoli ฉันดีใจที่คุณชี้แจงจุดของคุณว่าหมายถึงมีมากกว่าหนึ่งวิธีที่จะสกินแมวมากกว่าที่จะไม่มีวิธีการทำเช่นนี้ การคัดเลือกนักแสดงมีความสำคัญมากในการทำงานของฐานข้อมูล ตัวอย่างเช่นในเคียวรี PDO ที่ทำให้เป็นพารามิเตอร์จะมีการต่อสู้บางครั้งเพื่อให้ parser รู้ว่ามันเป็นตัวเลขไม่ใช่สตริงและจากนั้นคุณก็จบลงด้วย 0 ในฟิลด์จำนวนเต็มเพราะคุณไม่ได้โยนสตริงไปที่ int ในขั้นตอนพารามิเตอร์
stubsthewizard

คำตอบ:


1031

โดยทั่วไปคุณไม่จำเป็นต้องทำเช่นนี้เนื่องจาก PHP จะบีบบังคับให้คุณพิมพ์ในสถานการณ์ส่วนใหญ่ สำหรับสถานการณ์ที่คุณไม่ต้องการอย่างชัดเจนแปลงชนิดโยนมัน:

$num = "3.14";
$int = (int)$num;
$float = (float)$num;

4
นี่คือสถานการณ์ที่แตกต่างกันเล็กน้อยฉันต้องการแปลงสตริงใด ๆ (มีเฉพาะตัวเลข) เป็นตัวเลขทั่วไป ดังที่คุณทราบใน javaScript เราสามารถใช้parseInt ()เพื่อแปลง string => int หรือ parseFloat () เพื่อแปลง string => float แต่ในจาวาสคริปต์ทั่วไปใช้ Number () เพื่อแปลง string => number ฉันต้องการวิธีที่คล้ายกันใน PHP?
Sara

4
มันมีประโยชน์สำหรับฉันเมื่อฉันมีจำนวนเดือนที่ได้รับจากสตริงวันที่เต็มซึ่งฉันใช้ในการดึงค่าจากอาร์เรย์ชื่อมอด การแคตติ้งอัตโนมัติไม่ได้เกิดขึ้นที่นี่เพราะดัชนีสตริงถูกต้อง แต่ไม่เทียบเท่า
Cazuma Nii Cavalcanti

19
อาจไม่ปลอดภัยที่จะถือว่า.เป็นตัวแยกจุดทศนิยม en.wikipedia.org/wiki/…
Dave Jarvis

3
@Sara: คุณยังสามารถสร้างฟังก์ชั่นสำหรับการแปลงสตริงให้เป็นตัวเลขโดยเริ่มจากการชี้ไปที่จำนวนเต็มก่อนแล้วจึงทำการลอยแล้วเปรียบเทียบว่าค่าทั้งสอง (จำนวนเต็มและทศนิยม) เท่ากันหรือไม่ หากเป็นเช่นนั้นคุณควรส่งคืนค่าเป็นจำนวนเต็มหากไม่ใช่ถ้าเป็นแบบลอย หวังว่าคุณจะได้รับความคิด
พัก Igo

2
มีบางครั้งที่คุณต้องส่งจำนวนเต็มไปยังระบบไฟล์คุณไม่ควรรอให้ PHP ทำการแปลงให้คุณ
AAA

173

มีสองสามวิธีที่จะทำเช่นนั้น:

  1. ส่งสตริงไปยังชนิดข้อมูลดั้งเดิมที่เป็นตัวเลข:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
    
  2. ดำเนินการทางคณิตศาสตร์กับสตริง:

    $num = "10" + 1;
    $num = floor("10.1");
    
  3. ใช้intval()หรือfloatval():

    $num = intval("10");
    $num = floatval("10.1");
  4. settype()ใช้


9
ทราบว่าเป็นเพียงนามแฝงสำหรับ(double) (float)
หลอกลวง

4
@ ผู้ลงคะแนนเสียงฉันไม่ทราบว่ามีอะไรผิดปกติกับคำตอบของฉัน โปรดทราบว่าฉันโพสต์สิ่งนี้ก่อนที่ OP จะแก้ไขคำถามของเธออย่างไรก็ตามสิ่งนี้ครอบคลุมคำถามที่แก้ไขด้วยเช่นกัน ( $num = "10" + 1ตัวอย่าง)
fardjad

2
@ ed-ta: ค่อนข้างแน่ใจว่ามันจะคืนค่า min / max แทน 0 ถ้าคุณส่งสตริงไป intval("9999999999")==2147483647กล่าวคือ
riv

6
intvalมีประโยชน์เพราะคุณสามารถใช้ในarray_map('intval', $arrayOfStrings);การคัดเลือกนักแสดงที่ไม่สามารถทำได้
icc97

2
แทนที่จะ$num = "10" + 1;เป็นการดีกว่าที่จะใช้$num = "10" * 1;เนื่องจากจะไม่เปลี่ยนค่า (องค์ประกอบที่เป็นกลางของการคูณ) นี่คือสิ่งที่ต้องการtoNumber(..)ตั้งแต่ประเภทสุดท้ายจะถูกกำหนดโดยสิ่งที่จำเป็นในการแปลงสตริง "10" -> (int) 10; "10.1" -> (ลอย) 10.1;
ฮอลลี่

57

intval($var)เพื่อหลีกเลี่ยงปัญหาลอง ตัวอย่างบางส่วน:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34 (octal as starts with zero)
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26 (hex as starts with 0x)
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

4
IMHO นี่เป็นคำตอบเดียวที่ถูกต้องเพราะมันเป็นคำตอบเดียวที่นำค่าฐานของสตริงตัวเลขมาพิจารณา การตอบสนองทั้งหมด (แม้แต่ผู้ที่แนะนำฟังก์ชั่นที่ผู้ใช้กำหนดเอง) ที่ใช้การส่งแบบคาสท์จะล้มเหลวหากสตริงตัวเลขมีศูนย์นำหน้าอย่างน้อยหนึ่งรายการและสตริงไม่ได้มีจุดมุ่งหมายเป็นตัวเลขที่มีฐานแปด
ไวยากรณ์ Junkie

ความคิดใด ๆ ถ้าผมต้องการแปลง "12.7896" เพื่อ12.7896?
Agnes Palit

ใช้ floatval () เพื่อแปลงสตริงเป็นทศนิยม floatval ("12.7896") จะกลับ 12.7896
gopeca

ทำไมนี่ไม่ใช่คำตอบที่ยอมรับ? ในฐานะที่เป็นคนนอก PHP ฉันรู้แล้วว่า(int)$my_strจะไม่ทำงานตั้งแต่ผมจัดการเฉพาะกับสตริง liks 01และ013ที่ฉันต้องการที่จะตีความเป็นฐาน 10 ... ดังนั้นผมจึงต้องการวิธีอย่างชัดเจนให้ฐาน
Giacomo Alzetta

48

ในภาษาใดก็ตามที่พิมพ์ (แบบหลวม ๆ ) คุณสามารถส่งสตริงไปยังหมายเลขได้เสมอโดยเพิ่มศูนย์ลงไป

อย่างไรก็ตามมีความรู้สึกน้อยมากในเรื่องนี้เพราะ PHP จะทำมันโดยอัตโนมัติในเวลาที่ใช้ตัวแปรนี้และมันจะถูกส่งไปยังสตริงต่อไปในเวลาที่ส่งออก

โปรดทราบว่าคุณอาจต้องการเก็บตัวเลขที่มีจุดเป็นสตริงเนื่องจากหลังจากการชี้ไปที่ลอยมันอาจมีการเปลี่ยนแปลงอย่างไม่แน่นอนเนื่องจากลักษณะของตัวเลขลอยตัว


35
มีหลายภาษาที่คุณไม่สามารถแปลงสตริงเป็นตัวเลขได้โดยการเพิ่มศูนย์โดยปกติจะถือว่าเป็นข้อผิดพลาดแทนที่จะใช้วิธีการส่งที่ถูกต้อง :)
ม.ค. Špaček

4
honzasp ถูกต้องตัวอย่างเช่นใน JavaScript typeof('123'+0)ให้'string'เพราะจะช่วยให้'123'+0 '1230'
Oriol

5
หมายเหตุใน PHP ขอแนะนำให้ใช้เวลาส่วนใหญ่ในการเปรียบเทียบสไตล์ === ดังนั้นถ้าคุณจะทำการเปรียบเทียบข้อมูลของคุณมันสำคัญมากที่จะเก็บข้อมูลประเภทนั้นไว้
Jonathon

โปรดทราบว่าด้วยการเพิ่มศูนย์ที่คุณไม่ได้ 'กำลัง' ในความหมายที่แท้จริงคุณจะแปลง
CSᵠ

12
@oriol ใน javascript คุณต้องเพิ่มหมายเลขให้เป็นศูนย์0+'123'เพื่อรับ123
Timo Huovinen

24

คุณสามารถใช้ได้:

(int)(your value);

หรือคุณสามารถใช้:

intval(string)

จะเป็นอย่างไรถ้าหมายเลขที่ป้อนคือ '2.3456' ฉันจะได้รับ 2.3456 อย่างไร
Sara

6
คำถามก็เกี่ยวกับลอย
taseenb

แสดงบรรทัดที่ 1 จาก OP ที่มีคำว่าลอย ก่อนส่งความคิดเห็นและโหวตลงดูที่โพสต์ต้นฉบับ
noobie-php

2
ลอยตัวอย่างที่แสดงให้เห็นก็จะถามถึงวิธีการแปลงสตริงตัวเลขลงในค่าตัวเลข (ลอยและจำนวนเต็ม)
taseenb

ตรวจสอบก่อนว่าเป็นจำนวนที่ลอยด้วยis_floatและหากที่ผ่านแล้วโยนไปกับแทน(float) (int)
Martin van Driel

24

หากคุณต้องการได้รับการลอย$value = '0.4'แต่ int สำหรับ$value = '4'คุณสามารถเขียน:

$number = ($value == (int) $value) ? (int) $value : (float) $value;

สกปรกเล็กน้อย แต่ใช้งานได้


3
อาจสกปรกน้อยกว่านี้ไหม strpos($val, '.') === false ? intval($val) : floatval($val);
jchook

4
@jchook อาจจะสกปรกกว่าเพราะขึ้นอยู่กับสถานที่ - เช่น '0,4' แทนที่จะเป็น '0.4'
นิคไรซ์

จุดดี. ฉันคิดว่าคุณสามารถใช้แทนlocaleconv()['decimal_point'] '.'ข้อดีอย่างหนึ่งของการstrposแก้ปัญหาคือเกือบจะเร็วกว่าการร่ายสองเท่า
jchook

2
@jchook เป็นตัวแบ่งเช่น2.1e2มันมีจุดทศนิยม แต่จำนวนผลลัพธ์เป็นจำนวนเต็ม
TomášBlatný

1
เพียงแค่ใช้+ตัวดำเนินการประจำตัว: var_dump(+'0.4', +'4')จะช่วยให้คุณลอยและ int php.net/manual/en/language.operators.arithmetic.php
tvanc

15

คุณสามารถเพิ่มศูนย์ได้เสมอ!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)

ฉันได้รับข้อผิดพลาดA non well formed numeric value encounteredนี้ ความคิดใด ๆ
Agnes Palit

15

แทนที่จะต้องเลือกว่าจะแปลงstringไปintหรือfloatคุณก็สามารถเพิ่ม0ให้มันและ PHP อัตโนมัติจะแปลงผลเป็นชนิดที่เป็นตัวเลข

// Being sure the string is actually a number
if (is_numeric($string))
    $number = $string + 0;
else // Let the number be 0 if the string is not a number
    $number = 0;

13

ในPHPคุณสามารถใช้intval(string) or floatval(string)ฟังก์ชั่นในการแปลงสตริงเป็นตัวเลข


4
ไม่ฉันต้องการวิธีการทั่วไป ซึ่งหมายความว่าถ้า '5' => มันควรแปลงเป็น 5 และถ้าเป็น '2.345' => มันควรแปลงเป็น 2.345
Sara

13

ใช่มีวิธีการที่คล้ายกันใน PHP แต่ก็ไม่ค่อยมีใครรู้ว่าคุณจะไม่ค่อยได้ยินเกี่ยวกับมัน มันเป็นตัวดำเนินการทางคณิตศาสตร์ที่เรียกว่า " identity " ตามที่อธิบายไว้ที่นี่:

ผู้ประกอบการทางคณิตศาสตร์

ในการแปลงสตริงตัวเลขให้เป็นตัวเลขให้ทำดังนี้:

$a = +$a;

คำเตือน: ตรวจพบการแฮ็ก
เกร็ก

สวัสดี @Greg คุณคลิกที่ลิงค์โพสต์ที่นี่? นี่คือสิ่งที่นักพัฒนาพูดเกี่ยวกับตัวดำเนินการนี้: การแปลง $ a เป็น int หรือลอยตัวตามความเหมาะสม "การแปลง" ที่นี่ไม่สามารถเข้าใจได้ว่าเป็นการแปลงแบบตัวเลขต่อหมายเลข ทำไม? เพราะจากมุมมองทางคณิตศาสตร์พิเศษผู้ประกอบการนี้ไม่มีประโยชน์อย่างแน่นอน! การคูณตัวเลขใด ๆ ด้วย "+1" (เทียบเท่ากับฟังก์ชันตัวตน) จะไม่มีผลกระทบใด ๆ กับมัน ดังนั้นฉันไม่สามารถจินตนาการถึงยูทิลิตี้อื่น ๆ สำหรับผู้ปฏิบัติงานนี้ได้มากกว่าการแปลงประเภทที่แนะนำที่นี่
aldemarcalazans

@ Greg - แน่นอนนี้เป็นน้อยของสับกว่ามากที่สุดของคำตอบอื่น ๆ มันเป็นผู้ประกอบการในตัวที่ทำสิ่งที่ถูกร้องขอ (แม้ว่ามันจะเป็นการดีที่สุดในการตรวจสอบครั้งแรกis_numericดังนั้นให้มีที่วางโค้ดเพื่อจัดการสตริงที่ไม่สามารถแปลงได้อย่างถูกต้อง)
ToolmakerSteve

ฉันเข้าใจว่ามันใช้งานได้อย่างสมบูรณ์แบบในการใช้ตัวดำเนินการทางคณิตศาสตร์เพื่อการคัดเลือกนักแสดง แต่มันง่ายที่จะพลาด ฉันคิดว่ามันคุ้มค่ากับการเตือน
เกร็ก

11

เพียงเล็กน้อยจากคำตอบที่อาจมีประโยชน์และปลอดภัยกว่าในบางกรณี คุณอาจต้องการตรวจสอบว่าสตริงมีค่าตัวเลขที่ถูกต้องจริงก่อนแล้วจึงแปลงเป็นประเภทตัวเลข (ตัวอย่างเช่นถ้าคุณต้องจัดการข้อมูลที่มาจาก db ที่แปลง ints เป็นสตริง) คุณสามารถใช้is_numeric()แล้วfloatval():

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type

9

นี่คือฟังก์ชั่นที่บรรลุสิ่งที่คุณกำลังมองหา ก่อนอื่นเราตรวจสอบว่าค่าสามารถเข้าใจได้เป็นตัวเลขหรือไม่ถ้าใช่เราเปลี่ยนมันเป็น int และทุ่น ถ้า int และ float เหมือนกัน (เช่น 5 == 5.0) เราจะคืนค่า int หาก int และ float ไม่เหมือนกัน (เช่น 5! = 5.3) เราถือว่าคุณต้องการความแม่นยำของการลอยและคืนค่านั้น หากค่าไม่ใช่ตัวเลขเราจะส่งการเตือนและส่งคืน null

function toNumber($val) {
    if (is_numeric($val)) {
        $int = (int)$val;
        $float = (float)$val;

        $val = ($int == $float) ? $int : $float;
        return $val;
    } else {
        trigger_error("Cannot cast $val to a number", E_USER_WARNING);
        return null;
    }
}

6

ฉันพบว่าใน JavaScript วิธีง่ายๆในการแปลงสตริงเป็นตัวเลขคือการคูณมันด้วย 1 มันช่วยแก้ไขปัญหาการต่อข้อมูลเนื่องจากสัญลักษณ์ "+" มีการใช้งานหลายอย่างใน JavaScript ในขณะที่สัญลักษณ์ "*" ล้วนๆ สำหรับการคูณทางคณิตศาสตร์

จากสิ่งที่ฉันได้เห็นที่นี่เกี่ยวกับ PHP โดยอัตโนมัติยินดีที่จะตีความสตริงที่ประกอบด้วยตัวเลขเป็นตัวเลข (และความคิดเห็นเกี่ยวกับการเพิ่มเนื่องจากใน PHP เครื่องหมาย "+" เป็นเพียงการเพิ่มทางคณิตศาสตร์เท่านั้น) เคล็ดลับการคูณนี้ใช้งานได้ดี สำหรับ PHP ด้วย

ฉันได้ทำการทดสอบแล้วและมันใช้งานได้ ... แม้ว่าจะขึ้นอยู่กับว่าคุณได้รับสตริงมาอย่างไรคุณอาจต้องการใช้ฟังก์ชัน trim () กับมันก่อนที่จะคูณด้วย 1


6

นี่คือฟังก์ชั่นที่ฉันเขียนเพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้นสำหรับตัวเอง:

นอกจากนี้ยังส่งคืนเวอร์ชันแบบย่อของบูลีน, จำนวนเต็ม, สองเท่าและจริง

function type($mixed, $parseNumeric = false)
{        
    if ($parseNumeric && is_numeric($mixed)) {
        //Set type to relevant numeric format
        $mixed += 0;
    }
    $t = gettype($mixed);
    switch($t) {
        case 'boolean': return 'bool'; //shorthand
        case 'integer': return 'int';  //shorthand
        case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
        default: return $t;
    }
}

ประเภทการโทรพร้อมชุด parseNumeric เป็น true จะแปลงสตริงตัวเลขก่อนตรวจสอบประเภท

ดังนั้น:

type ("5", true) จะคืนค่า int

type ("3.7", true) จะส่งคืน float

type ("500") จะส่งคืนสตริง

เพียงแค่ระวังเนื่องจากนี่เป็นวิธีการตรวจสอบที่ผิดพลาดและตัวแปรที่แท้จริงของคุณจะยังคงเป็นสตริง คุณจะต้องแปลงตัวแปรจริงเป็นประเภทที่ถูกต้องหากจำเป็น ฉันแค่ต้องการมันเพื่อตรวจสอบว่าฐานข้อมูลควรโหลด id ไอเท็มหรือชื่อแทนดังนั้นจึงไม่มีผลกระทบที่ไม่คาดคิดเพราะมันจะถูกวิเคราะห์เป็นสตริงในขณะใช้งาน

แก้ไข

หากคุณต้องการที่จะตรวจสอบว่าวัตถุเป็นฟังก์ชั่นเพิ่มกรณีนี้เพื่อสวิทช์:

case 'object': return is_callable($mixed)?'function':'object';

6

นอกจากคำตอบของ Boykodevฉันแนะนำสิ่งนี้:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)

หลังจากคิดเรื่องนี้ไปหน่อยฉันก็สามารถแนะนำหารด้วย 1 :)
Boykodev

1
นั่นคือประเด็น! :) โดยวิธีการแก้ปัญหาของคุณดีกว่าสัญลักษณ์ทางวิทยาศาสตร์ทั้งหมดข้างต้น ขอบคุณ.
drugan

วิธีนี้แก้ปัญหาของฉันได้ ในกรณีของฉัน$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;แทนที่จะเป็น $ target_id_cron = (int) $ id_cron - 1;
inMILD

1
ผมได้รับข้อผิดพลาดนี้เมื่อฉันต้องการที่จะเปลี่ยนสตริงลอยA non well formed numeric value encountered $num = '12,24' * 1ข้อเสนอแนะใด ๆ
Agnes Palit

5
$a = "10";

$b = (int)$a;

คุณสามารถใช้การแปลงสตริงเป็น int ในPHP


2
หากหมายเลขที่ป้อนคือ '7.2345' ฉันไม่สามารถใช้ (int) ได้ฉันจะต้องใช้ (ลอย) สิ่งที่ฉันต้องการคือทางออกทั่วไป
Sara

1
คุณสามารถใช้สองครั้งหรือลอย
Pritom

5

คุณสามารถเขียนดังนี้:

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>

3
ในขณะที่รหัสนี้อาจตอบคำถาม แต่มีบริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถามช่วยปรับปรุงมูลค่าระยะยาว
Alex Riabov

1
คุณแน่ใจเกี่ยวกับเรื่องนี้? สิ่งนี้จะไม่แปลงสตริงเป็นตัวเลข แต่อาร์เรย์เป็นสตริง JSON
Nico Haase

ใช่ @NicoHaase ถ้าตัวเลขอยู่ในรูปแบบสตริงในอาร์เรย์มันจะแปลงเป็นตัวเลข
โดมินิคอะมาลโจ F

5

คูณตัวเลขด้วย 1 เท่านั้นเพื่อให้สตริงถูกแปลงเป็นหมายเลขชนิด

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}

ยุติธรรมพอ แต่วิธีนี้ (และกลอุบายที่คล้ายกัน) มีการระบุไว้แล้วใน 24 คำตอบสำหรับคำถามนี้ - ฉันไม่เห็นคุณค่าในการโพสต์อีกครั้ง
DavidW

4

คุณสามารถใช้ได้:

((int) $var)   ( but in big number it return 2147483647 :-) )

แต่ทางออกที่ดีที่สุดคือการใช้:

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

หรือ

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;

2

คุณสามารถเปลี่ยนประเภทข้อมูลได้ดังนี้

$number = "1.234";

echo gettype ($number) . "\n"; //Returns string

settype($number , "float");

echo gettype ($number) . "\n"; //Returns float

ด้วยเหตุผลทางประวัติศาสตร์ "double" จะถูกส่งกลับในกรณีที่มีการลอย

เอกสาร PHP


2

คำแนะนำทั้งหมดจะสูญเสียประเภทตัวเลข

นี่เป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับฉัน:

function str2num($s){
// Returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "\nret=$return_value type=".gettype($return_value)."\n";
}

1

PHP จะทำเพื่อคุณภายในขอบเขต

<?php
   $str = "3.148";
   $num = $str;

   printf("%f\n", $num);
?>

ฉันไม่ต้องการออกไปใส่มัน ฉันต้องการแปลงและบันทึกเป็นตัวแปร
Sara

1
โดยอัตโนมัติแปลงเป็นลอย การแปลงชนิด PHP แบบหลวมนั้นเหมาะสำหรับคุณ แม้ว่ามันอาจไม่ได้ทำในสิ่งที่คุณคาดหวังดังนั้นคำตอบอื่น ๆ ที่มีการแปลงอย่างชัดเจนอาจทำงานได้ดีขึ้นสำหรับคุณ
Adrian Cornish

$ str สามารถมี '5' หรือ '5.258' โดยใช้ printf ("% f \ n", $ str) '5' จะออกมาเป็น 5.000000 (ฉันต้องการให้เป็น 5) สำหรับ 5.280000 (ฉันต้องการเป็น 5.28) จุดทศนิยมมากขึ้น
Sara

1

มีวิธีคือ:

$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

การใช้is_*จะไม่ทำงานตั้งแต่เป็น:variablestring

การใช้การรวมกันของjson_encode()แล้วjson_decode()มันจะถูกแปลงเป็นรูปแบบ "ของจริง" ถ้ามันเป็นเรื่องจริงstringมันจะผิดไปหมด

$num = "Me";
$int = (int)$num;
$float = (float)$num;

var_dump($num, $int, $float);

จะส่งออก: string(2) "Me" int(0) float(0)


0

ฉันได้รับคำถาม "บอกว่าคุณกำลังเขียนฟังก์ชั่นบิวท์อินสำหรับหล่อจำนวนเต็มไปยังสตริงใน PHP คุณจะเขียนฟังก์ชันนั้นอย่างไร" ในการสัมภาษณ์การเขียนโปรแกรม นี่คือทางออก

$nums = ["0","1","2","3","4","5","6","7","8","9"];
$int = 15939; 
$string = ""; 
while ($int) { 
    $string .= $nums[$int % 10]; 
    $int = (int)($int / 10); 
} 
$result = strrev($string);

0

ฉันอ่านคำตอบและไม่เห็นใครพูดถึง caveat ที่ยิ่งใหญ่ที่สุดในการแปลงตัวเลขของ PHP

คำตอบที่ upvoted ที่สุดแนะนำให้ทำดังต่อไปนี้:

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3

นั่นยอดเยี่ยม PHP ทำการคัดเลือกโดยตรง แต่ถ้าเราทำสิ่งต่อไปนี้

$str = "3.14is_trash"
$intstr = (int)$str

PHP พิจารณาว่าการแปลงนั้นถูกต้องหรือไม่?

เห็นได้ชัดว่าใช่

PHP อ่านสตริงจนกระทั่งพบอักขระที่ไม่ใช่ตัวเลขแรกสำหรับประเภทที่ต้องการ ความหมายสำหรับจำนวนเต็มอักขระตัวเลขคือ [0-9] เป็นผลให้มันอ่าน3ได้เนื่องจากอยู่ในช่วงอักขระ [0-9] จึงอ่านต่อไป อ่าน.และหยุดที่นั่นเนื่องจากไม่อยู่ในช่วง [0-9]

เหมือนกันจะเกิดขึ้นถ้าคุณถูกโยนให้ลอยหรือสองเท่า PHP จะอ่าน3จาก.นั้น1จึง4และจะหยุดiเพราะไม่มีตัวอักษรตัวเลขลอยที่ถูกต้อง

เป็นผลให้การ"million" >= 1000000ประเมินเป็นเท็จ แต่ประเมิน"1000000million" >= 1000000true

ดูสิ่งนี้ด้วย:

https://www.php.net/manual/th/language.operators.comparison.phpวิธีการแปลงเสร็จในขณะที่เปรียบเทียบ

https://www.php.net/manual/th/language.types.string.php#language.types.string.conversionวิธีที่สตริงจะถูกแปลงเป็นตัวเลขตามลำดับ


0

หากคุณไม่ทราบล่วงหน้าหากคุณมีทศนิยมหรือจำนวนเต็ม
และหากสตริงอาจมีอักขระพิเศษ (เช่นช่องว่าง€ ฯลฯ )
และถ้ามันอาจมีมากกว่า 1 จุดหรือเครื่องหมายจุลภาค
คุณสามารถใช้สิ่งนี้ ฟังก์ชั่น:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
    // return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/\d/', $string)) {
        return 0;
    } 

    // Replace all ',' with '.':
    $workingString = str_replace(',', '.', $string);

    // Keep only number and '.':
    $workingString = preg_replace("/[^0-9.]+/", "", $workingString);

    // Split the integer part and the decimal part,
    // (and eventually a third part if there are more 
    //     than 1 decimal delimiter in the string):
    $explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

    if (sizeof($explodedString) === 1) {
        // No decimal delimiter was present in the string,
        // create a string representing an integer:
        $workingString = $explodedString[0];
    } else {
        // A decimal delimiter was present,
        // create a string representing a float:
        $workingString = $explodedString[0] . '.' .  $explodedString[1];
    }

    // Create a number from this now non-ambiguous string:
    $number = $workingString * 1;

    return $number;
}

-8

วิธีการที่แตกต่าง:

  1. กดทั้งหมดลงในอาร์เรย์ / อาร์เรย์ที่สัมพันธ์กัน
  2. json_encode($your_array, JSON_NUMERIC_CHECK); เลือกที่จะถอดรหัสกลับ
  3. ?
  4. กำไร!

7
Stack Overflow เป็นคำตอบสำหรับคำถามไม่ใช่เรื่องตลก ฉันแน่ใจว่ามีสถานที่สำหรับสิ่งนั้น แต่ที่นี่ไม่ใช่ที่นี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.