19 กรกฎาคม 2559

Published 7/19/2559 by with 0 comment

หลักการแปลงโค้ด PHP มาภาษา Python

สวัสดีผู้อ่านทุกท่านครับ มาพบกับบทความพิเศษ "หลักการแปลงโค้ด PHP มาภาษา Python" เพื่อเป็นแนวทางศึกษาให้กับผู้ที่สนใจแปลงโค้ด PHP มาภาษา Python ครับ


ผมต้องการแปลงโค้ด  PHP จาก http://justmindthought.blogspot.com/2012/12/code-php.html มายังภาษา Python เพื่อนำมาใช้ในงานโมดูล NLP ของผม
การแปลงโค้ดข้ามภาษาด้วยมือตัวเองไม่เคยง่ายอย่างที่คิด

ผมได้ลองแปลงโดยใช้ความรู้ PHP และ Python ที่ผมมี ผมสรุปเป็นข้อ ๆ ได้ดังนี้

  • เอา <? > ออก
  • เปลี่ยน function เป็น def
  • เอา $ เอาทั้งหมด
  • เอา ; ด้านหลังสุด เอาทั้งหมด
  • เปลี่ยน // เป็น # ทั้งหมด
  • เปลี่ยน ++ เป็น +=1 (บวกเพิ่มอีก1)
  • เปลี่ยนการดำเนินการ === เป็น ==
  • เปลี่ยน .= เป็น + และเปลี่ยน . ในบรรทัดเดียวกัน เป็น +
  • เปลี่ยน true , false ให้เป็น True , False
  • ถ้ามี for loop แนะนำให้แปลงเป็น while ใน Python จะง่ายขึ้น
  • จัดคำสั่งที่อยู่ใน {} ตาม Logic เดิมในรูปแบบ Python โดยห้ามปนกัน แล้วเอา {} เอา แทนที่ { ด้วย : หลังคำสั่ง

โค้ดเกือบสมบูรณ์ แต่ผมยังไม่ได้แปลงโค้ดอย่าง number_format() , array() , substr() , strpos() , intval() , fmod()

คำถามคือ เราจะต้องไล่เปิด docs ทั้ง PHP และ Python เพื่อเทียบคำสั่งว่าคำสั่งไหนมีหน้าที่ตรงกันไหม ? (ซึ่งจะต้องใช้เวลานานมาก ...)

ใคร ๆ คงไม่อยากตอบว่า ใช่

ผมขอแนะนำเว็บช่วยเทียบคำสั่ง PHP กับ Python ที่ชื่อว่า php2python.com ครับ

การใช้งานเว็บ php2python.com เราเพียงพิมพ์คำสั่ง PHP ลงไปในช่องค้นหา เช่น  intval เว็บนี้จะมีคำแนะนำให้ว่า  intval คือ int ใน Python นั่นเอง และจะบอกวิธีแปลงคำสั่งและอาจมีการสร้างคำสั่งเลียนแบบ PHP ใน Python ให้ใช้ด้วยครับ

จบปัญหานี้ แต่มีปัญหาที่ผมถือว่าใหญ่มาก ในการแปลงโค้ด  PHP จาก http://justmindthought.blogspot.com/2012/12/code-php.html มายังภาษา Python  คือ โค้ดนี้

$ret .= (($divider == 10) && ($d == 2)) ? "ยี่" :
((($divider == 10) && ($d == 1)) ? "" :
((($divider == 1) && ($d == 1) && ($ret != "")) ? "เอ็ด" : $number_call[$d]));
$ret .= ($d ? $position_call[$pos] : "");

โค้ดเหล่านี้หมายความว่าอะไร ... ????????????????????????????????

มันคือ PHP Shorthand If / Else อ่านได้ที่ http://www.wingfoss.in.th/content/short-if-else (ซึ่งแกะยากมาก) ตอนนี้ผมทำอะไรได้ ผมทำได้แค่เพียงไล่แกะทีละ () ลงไปเรื่อย ๆ ได้โค้ด Python ดังนี้ ????????????

if (divider == 10) and (d == 2):
 ret += "ยี่"
elif (divider == 10) and (d == 1):
 ret += ""
elif ((divider == 1) and (d == 1) and (ret != "")):
 ret += "เอ็ด"
else:
 ret += number_call[d]
if(d):
 ret += position_call[pos]
else:
 ret += ""

พอแปลงโค้ดเสร็จแล้วให้ลองรันเรียกใช้ฟังก์ชันดูครับ
โค้ดฉบับ Python :

import math
def number_format(num, places=0):
    return '{:20,.2f}'.format(num)
# fork by http://justmindthought.blogspot.com/2012/12/code-php.html
def ThaiBahtConversion(amount_number):
    amount_number = number_format(amount_number, 2).replace(" ","")
    #print(amount_number)
    pt = amount_number.find(".")
    number,fraction = "",""
    amount_number1 = amount_number.split('.')
    if (pt == False):
        number = amount_number
    else:
        amount_number = amount_number.split('.')
        number = amount_number[0]
        fraction = int(amount_number1[1]) #amount_number[pt:pt + 1]
    ret = ""
    number=eval(number.replace(",",""))
    #print(type(number))
    baht = ReadNumber(number)
    if (baht != ""):
        ret += baht + "บาท"
    #print(amount_number)
    satang = ReadNumber(fraction)
    if (satang != ""):
        ret += satang + "สตางค์"
    else:
        ret += "ถ้วน"
    return ret


def ReadNumber(number):
    position_call = ["แสน", "หมื่น", "พัน", "ร้อย", "สิบ", ""]
    number_call = ["", "หนึ่ง", "สอง", "สาม","สี่", "ห้า", "หก", "เจ็ด", "แปด", "เก้า"]
    number = number
    ret = ""
    if (number == 0): return ret
    if (number > 1000000):
        ret += ReadNumber(int(number / 1000000)) + "ล้าน"
        number = int(math.fmod(number, 1000000))
    divider = 100000
    pos = 0
    while(number > 0):
        d=int(number/divider)
        if (divider == 10) and (d == 2):
            ret += "ยี่"
        elif (divider == 10) and (d == 1):
            ret += ""
        elif ((divider == 1) and (d == 1) and (ret != "")):
            ret += "เอ็ด"
        else:
            ret += number_call[d]
        if(d):
            ret += position_call[pos]
        else:
            ret += ""
        number=number % divider
        divider=divider / 10
        pos += 1
    return retprint(ThaiBahtConversion(85.75))


ผลลัพธ์
แปดสิบห้าบาทเจ็ดสิบห้าสตางค์

ลองแปลงโค้ดจาก PHP มาภาษา Python กันครับ
ติดตามบทความมต่อไปนะครับ
ชอบคุณครับ
บทความนี้เขียนโดย นาย วรรณพงษ์ ภัททิยไพบูลย์ ชั้น ม.6 โรงเรียนนางรอง  ปัจจุบัน กำลังศึกษาชั้นปีที่ 1 สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์ มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย
อีเมล : [email protected]

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)