BaseConversion เป็นไลบรารี PHP สำหรับการแปลงฐานตัวเลข ซึ่งคล้ายกับฟังก์ชัน base_convert()
ในตัวของ PHP อย่างไรก็ตาม ไลบรารีนี้ไม่ได้จำกัดด้วยจำนวนเต็ม 32 บิต ซึ่งต่างจากฟังก์ชันในตัวตรงและสามารถแปลงตัวเลขที่มีความแม่นยำตามอำเภอใจได้ ไลบรารีนี้ยังรองรับการแปลงเศษส่วนและปรับแต่งฐานตัวเลขได้มากขึ้น
เพื่อเพิ่มประสิทธิภาพการแปลงจำนวนมาก ไลบรารีนี้ยังใช้กลยุทธ์การแปลงที่แตกต่างกันสองแบบ ในบางกรณี คุณสามารถแปลงตัวเลขได้ง่ายๆ โดยการแทนที่ตัวเลขด้วยตัวเลขจากฐานอื่น (เช่น เมื่อแปลงจากฐาน 2 ไปเป็นฐาน 16) ซึ่งเร็วกว่ากลยุทธ์อื่นๆ อย่างมาก ซึ่งเพียงแค่คำนวณตัวเลขใหม่โดยใช้เลขคณิตจำนวนเต็มความแม่นยำตามอำเภอใจ
เอกสารประกอบ API ซึ่งสามารถสร้างได้โดยใช้ Apigen สามารถอ่านออนไลน์ได้ที่: http://kit.riimu.net/api/baseconversion/
gmp
(รองรับ IDN ที่จำเป็นเท่านั้น) วิธีที่ง่ายที่สุดในการติดตั้งไลบรารีนี้คือการใช้ Composer เพื่อจัดการการขึ้นต่อกันของคุณ ในการติดตั้งไลบรารีนี้ผ่าน Composer เพียงปฏิบัติตามสองขั้นตอนเหล่านี้:
รับ composer.phar
โดยการรันการติดตั้งบรรทัดคำสั่ง Composer ในรูทโปรเจ็กต์ของคุณ
เมื่อคุณรันสคริปต์การติดตั้งแล้ว คุณควรมีไฟล์ composer.phar
ในโปรเจ็กต์รูทของคุณ และคุณสามารถรันคำสั่งต่อไปนี้:
php composer.phar require "riimu/kit-baseconversion:^1.2"
หลังจากติดตั้งไลบรารีนี้ผ่าน Composer คุณสามารถโหลดไลบรารีโดยรวมไฟล์ vendor/autoload.php
ที่สร้างโดย Composer ระหว่างการติดตั้ง
หากคุณคุ้นเคยกับวิธีใช้ Composer อยู่แล้ว คุณสามารถเพิ่มไลบรารีเป็นการพึ่งพาได้โดยการเพิ่มไฟล์ composer.json
ต่อไปนี้ในโปรเจ็กต์ของคุณ และรันคำสั่ง composer install
:
{
"require" : {
"riimu/kit-baseconversion" : " ^1.2 "
}
}
หากคุณไม่ต้องการใช้ Composer เพื่อโหลดไลบรารี คุณสามารถดาวน์โหลดไลบรารีได้ด้วยตนเองโดยการดาวน์โหลดรุ่นล่าสุดและแยกโฟลเดอร์ src
ไปยังโปรเจ็กต์ของคุณ จากนั้นคุณอาจรวมไฟล์ src/autoload.php
ที่ให้มาเพื่อโหลดคลาสไลบรารี
วิธีที่สะดวกที่สุดในการใช้ไลบรารีนี้คือการใช้วิธีคงที่ baseConvert()
ที่ได้รับจากคลาส BaseConverter
ในกรณีส่วนใหญ่ มันจะทำงานในลักษณะเดียวกับที่ base_convert()
ทำ ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' A37334 ' , 16 , 2 ); // outputs: 101000110111001100110100
วิธีการนี้ยอมรับจำนวนลบและเศษส่วนในลักษณะเดียวกัน สามารถใช้พารามิเตอร์ตัวเลือกที่สี่เพื่อกำหนดความแม่นยำสำหรับการแปลงได้ ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' -1BCC7.A ' , 16 , 10 ) . PHP_EOL ; // outputs: -113863.625
echo BaseConverter:: baseConvert ( ' -1BCC7.A ' , 16 , 10 , 1 ); // outputs: -113863.6
วิธีการคงที่เป็นเพียง wrapper ที่สะดวกสำหรับการสร้างอินสแตนซ์ของ BaseConvert
และเรียกใช้เมธอด setPrecision()
และ convert()
หากคุณต้องการแปลงตัวเลขหลายหมายเลข การเรียกออบเจ็กต์ในลักษณะที่ไม่คงที่จะมีประสิทธิภาพมากกว่า ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
$ converter = new BaseConverter ( 16 , 10 );
echo $ converter -> convert ( ' A37334 ' ) . PHP_EOL ; // outputs: 10711860
echo $ converter -> convert ( ' -1BCC7.A ' ) . PHP_EOL ; // outputs: -113863.625
$ converter -> setPrecision ( 1 );
echo $ converter -> convert ( ' -1BCC7.A ' ); // outputs: -113863.6
หากหมายเลขที่ระบุมีตัวเลขที่ไม่ถูกต้องซึ่งไม่ได้เป็นส่วนหนึ่งของฐานตัวเลขที่กำหนด วิธีการจะส่งคืนค่าเท็จแทน
แม้ว่าไลบรารีนี้จะรองรับการแปลงเศษส่วน แต่สิ่งสำคัญคือต้องเข้าใจว่าเศษส่วนไม่สามารถแปลงจากฐานตัวเลขไปเป็นอีกวิธีหนึ่งได้อย่างแม่นยำเสมอไป เช่นเดียวกับการแปลงจำนวนเต็ม นี่เป็นผลมาจากความจริงที่ว่าเศษส่วนทั้งหมดไม่สามารถแสดงเป็นฐานตัวเลขอื่นได้
ตัวอย่างเช่น สมมติว่าเรามีเลข 0.1 ในฐาน 3 ซึ่งเท่ากับ 1/3 ในฐาน 10 อย่างไรก็ตาม หากคุณแทน 1/3 เป็นเลขทศนิยม คุณจะได้ค่า '0.3333 ซ้ำอย่างไม่สิ้นสุด ..' ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 ) . PHP_EOL ; // outputs: 0.33
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 , 6 ) . PHP_EOL ; // outputs: 0.333333
echo BaseConverter:: baseConvert ( ' 0.1 ' , 3 , 10 , 12 ); // outputs: 0.333333333333
เนื่องจากลักษณะการทำงานนี้ จึงสามารถตั้งค่าความแม่นยำที่ใช้สำหรับการแปลงเศษส่วนที่ไม่ถูกต้องได้ ดังที่เห็นในตัวอย่างก่อนหน้านี้ ค่าความแม่นยำจะกำหนดจำนวนหลักสูงสุดในตัวเลขผลลัพธ์ อย่างไรก็ตาม ผลลัพธ์อาจมีตัวเลขน้อยกว่า หากสามารถแปลงตัวเลขได้อย่างแม่นยำโดยใช้ตัวเลขจำนวนน้อย ความเที่ยงตรงอาจถูกละเลยโดยสิ้นเชิง หากตัวแปลงรู้ว่าสามารถแปลงเศษส่วนได้อย่างแม่นยำ
ค่าความแม่นยำยังมีคำจำกัดความอื่นอีกด้วย ถ้าความแม่นยำเป็น 0 หรือจำนวนลบ จำนวนหลักสูงสุดของผลลัพธ์จะขึ้นอยู่กับความแม่นยำของตัวเลขเดิม ถ้าความแม่นยำเป็น 0 ผลลัพธ์ที่ได้จะมีตัวเลขมากเท่าที่ต้องใช้เพื่อแสดงตัวเลขที่มีความแม่นยำเท่ากับตัวเลขเดิม จำนวนลบจะเพิ่มจำนวนหลักนอกเหนือจากนั้น ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 0.A7 ' , 16 , 10 , 0 ) . PHP_EOL ; // outputs: 0.652
echo BaseConverter:: baseConvert ( ' 0.A7 ' , 16 , 10 , - 2 ); // outputs: 0.65234
ในตัวอย่างก่อนหน้านี้ ตัวเลขเดิมคือ 0.A7
ในฐาน 16 ตัวเลขฐาน 16 ที่มีเลขสองหลักในส่วนที่เป็นเศษส่วนสามารถแทนตัวเลขได้โดยมีความแม่นยำถึง 1/(16 * 16) == 1/256
หากต้องการแสดงเศษส่วนด้วยความแม่นยำเท่ากันในฐาน 10 เราจำเป็นต้องมีตัวเลขอย่างน้อย 3 หลัก เนื่องจากตัวเลขสองหลักสามารถแสดงตัวเลขได้จนถึงความแม่นยำ 1/100
เท่านั้น
ค่าความแม่นยำเริ่มต้นที่ใช้โดยไลบรารีคือ -1
สิ่งสำคัญที่ควรทราบคือตัวเลขหลักสุดท้ายจะไม่ถูกปัดเศษ (เนื่องจากอาจทำให้ผลลัพธ์ไม่สอดคล้องกันในบางกรณี)
เพื่อให้ผู้ใช้โต้ตอบกับไลบรารีได้สะดวกยิ่งขึ้น ไลบรารีจะถือว่าตัวเลขทั้งหมดในลักษณะที่ไม่คำนึงถึงขนาดตัวพิมพ์ เว้นแต่ฐานตัวเลขจะห้ามไว้ ตัวอย่างเช่น ฐาน 16 สามารถใช้ในลักษณะที่ไม่คำนึงถึงขนาดตัวพิมพ์ เนื่องจากจะกำหนดค่าสำหรับตัวเลข 0-9A-F
เท่านั้น อย่างไรก็ตาม ฐาน 62 ไม่สามารถพิจารณาตัวพิมพ์เล็กหรือใหญ่ได้ เนื่องจากตัวอักษรเช่น A
และ a
มีค่าที่แตกต่างกัน
ตัวเลขที่ส่งคืนจะคำนึงถึงขนาดตัวพิมพ์ของอักขระที่กำหนดโดยฐานตัวเลขเสมอ ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 7BFA11 ' , 16 , 12 ) . PHP_EOL ; // outputs: 2879B29
echo BaseConverter:: baseConvert ( ' 7bfa11 ' , 16 , 12 ); // outputs: 2879B29
คุณสมบัติอย่างหนึ่งของไลบรารีนี้คือช่วยให้ปรับแต่งฐานตัวเลขได้ดีกว่า base_convert()
ในกรณีส่วนใหญ่ คุณอาจกำหนดฐานตัวเลขโดยใช้จำนวนเต็มธรรมดา เช่น 10
หรือ 16
อย่างไรก็ตาม ไม่มีการจำกัดขนาดของจำนวนเต็มนั้น ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 7F ' , 16 , 1024 ) . PHP_EOL ; // outputs: #0127
echo BaseConverter:: baseConvert ( ' 5Glm1z ' , 64 , 512 ); // outputs: #456#421#310#371
อย่างไรก็ตาม สำหรับฐานจำนวนมาก ตัวเลขจะแสดงด้วยสตริงที่ประกอบด้วย #
และค่าของตัวเลขเท่านั้น เมื่อใดก็ตามที่ฐานตัวเลขถูกกำหนดโดยใช้จำนวนเต็ม ตัวเลขจะเป็นไปตามกฎต่อไปนี้:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
#
และค่าสำหรับตัวเลข (ความยาวของสตริงขึ้นอยู่กับค่าหลักที่ยิ่งใหญ่ที่สุด) นอกจากการกำหนดฐานตัวเลขโดยใช้จำนวนเต็มแล้ว ยังสามารถกำหนดฐานตัวเลขโดยใช้สตริงได้อีกด้วย อักขระแต่ละตัวในสตริงแสดงถึงตัวเลขและตำแหน่งของอักขระแต่ละตัวแสดงถึงค่าของมัน ตัวอย่างเช่น ฐาน 16 สามารถกำหนดเป็น 0123456789ABCDEF
การกำหนดฐานตัวเลขด้วยวิธีนี้ยังทำให้ง่ายต่อการรับตัวเลขผลลัพธ์ในบางกรณีอีกด้วย ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 101100011101 ' , ' 01 ' , 16 ) . PHP_EOL ; // outputs: B1D
echo BaseConverter:: baseConvert ( ' 101100011101 ' , 2 , ' 0123456789abcdef ' ); // outputs: b1d
ยังมีวิธีที่สามในการกำหนดฐานตัวเลขโดยใช้อาร์เรย์ ซึ่งช่วยให้ปรับแต่งได้มากขึ้นในแง่ของฐานตัวเลข แต่ละค่าในอาร์เรย์แสดงถึงตัวเลขและดัชนีระบุค่า ตัวอย่างเช่น:
<?php
require ' src/autoload.php ' ;
use Riimu Kit BaseConversion BaseConverter ;
echo BaseConverter:: baseConvert ( ' 22 ' , 10 , [ ' nil ' , ' one ' ]) . PHP_EOL ; // outputs: oneniloneonenil
echo BaseConverter:: baseConvert ( ' 187556 ' , 10 , [ ' - ' , ' -! ' , ' -" ' , ' -# ' , ' -¤ ' , ' -% ' ]); // outputs: -¤---¤-!-%-"
ห้องสมุดนี้เป็นลิขสิทธิ์ (c) 2013-2017 Riikka Kalliomäki
ดูใบอนุญาตสำหรับข้อมูลใบอนุญาตและการคัดลอก